od icon indicating copy to clipboard operation
od copied to clipboard

[volby] připravit dobrý view s přehledem kandidátů napříč volbami

Open kokes opened this issue 4 years ago • 2 comments

Je dobrý mít jednu tabulku se všema kandidaturama, protože pak má člověk fajn přehled o tom, kdo kdy kam chtěl. Je to celkem přímočarý úkol, nějakou dobu používám jedno view, ale je v něm bohužel bug ohledně stran (nebyly v potaz brány koalice) a hlavně... asi bych tam chtěl krom kandidující strany i tu členskou, navrhující atd. Bude tam možná nutný nějaký UNNEST nad koalicema a další finty. Asi bych si spočítal statistiky současnýho řešení a při dělání změn kontroloval, že nám to žádný join neduplikoval.

Příklady toho, co by to mělo řešit:

  1. Volební koalice (TOPSTAN do EP, SPOLU/PirSTAN do PSP
  2. TSS, což neni koalice, ale nová strana do voleb (Trikolóra a spol., PSP 2021)
  3. BEZPP nějak dobře zakódován
  4. Někde je 99 nebo jiná "NULL" hodnota, dát si na to pozor

Asi bude potřeba nějaký spot check u někoho známého - kdy si vyfiltrujem jen jeho a podíváme se, že jeho volební, navrhující i příslušnostní strana jsou správně. A asi bych to dělal jedny volby po druhejch, ne všechno najednou. Taky bych všechny inner joiny nahradil leftama, ať můžem detekovat nenajoinovaný věci.

Moje současný view (už s opravou koalic u psp), ale co tak koukám, problém se stranama bude nejspíš i u komunálu a možná i jinde:

 SELECT 'senat'::text AS volby,
    (senat_kandidati.obvod || ' - '::text) || senat_obvody.nazev_obv AS obvod,
    senat_kandidati.datum,
    (senat_kandidati.jmeno || ' '::text) || senat_kandidati.prijmeni AS jmeno,
    senat_kandidati.nazev_vs AS strana,
    senat_kandidati.vek,
    senat_kandidati.povolani,
    senat_kandidati.zvolen_k1 = 1 OR senat_kandidati.zvolen_k2 = 1 AS zvolen
   FROM volby.senat_kandidati
     JOIN volby.senat_obvody USING (datum, obvod)
UNION ALL
 SELECT 'ep'::text AS volby,
    NULL::text AS obvod,
    ep_kandidati.datum,
    (ep_kandidati.jmeno || ' '::text) || ep_kandidati.prijmeni AS jmeno,
    ep_strany.nazevcelk AS strana,
    ep_kandidati.vek,
    ep_kandidati.povolani,
    ep_kandidati.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.ep_kandidati
     JOIN volby.ep_strany USING (datum, estrana)
UNION ALL
 SELECT 'obce'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.komunalni_kandidati kn
     JOIN volby.komunalni_strany ks ON kn.nstrana = ks.vstrana AND kn.datum = ks.datum
UNION ALL
 SELECT 'kraje'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.kraje_kandidati kn
     JOIN volby.kraje_strany_cr ks ON kn.nstrana = ks.vstrana AND kn.datum = ks.datum
UNION ALL
 SELECT 'psp'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.psp_kandidati kn
     JOIN volby.psp_strany ks ON ks.datum = kn.datum AND ks.kstrana = kn.kstrana
UNION ALL
 SELECT 'prezident'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ps.nazev_strn AS strana,
    kn.vek,
    kn.povolani,
    kn.zvolen_k1 = 1 OR kn.zvolen_k2 = 1 AS zvolen
   FROM volby.prezident_kandidati kn
     JOIN volby.prezident_strany ps ON kn.nstrana = ps.nstrana AND kn.datum = ps.datum;

kokes avatar Aug 30 '21 12:08 kokes

Upraveno o správné join klíče, ale furt tam chybí rozdělení mezi kandidující subjekty a členské subjekty

 SELECT 'senat'::text AS volby,
    (senat_kandidati.obvod || ' - '::text) || senat_obvody.nazev_obv AS obvod,
    senat_kandidati.datum,
    (senat_kandidati.jmeno || ' '::text) || senat_kandidati.prijmeni AS jmeno,
    senat_kandidati.nazev_vs AS strana,
    senat_kandidati.vek,
    senat_kandidati.povolani,
    senat_kandidati.zvolen_k1 = 1 OR senat_kandidati.zvolen_k2 = 1 AS zvolen
   FROM volby.senat_kandidati
     JOIN volby.senat_obvody USING (datum, obvod)
UNION ALL
 SELECT 'ep'::text AS volby,
    NULL::text AS obvod,
    ep_kandidati.datum,
    (ep_kandidati.jmeno || ' '::text) || ep_kandidati.prijmeni AS jmeno,
    ep_strany.nazevcelk AS strana,
    ep_kandidati.vek,
    ep_kandidati.povolani,
    ep_kandidati.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.ep_kandidati
     JOIN volby.ep_strany USING (datum, estrana)
UNION ALL
 SELECT 'obce'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.komunalni_kandidati kn
      -- inner joinem vynechame 35 vyskrtnutych kandidatu
     JOIN volby.komunalni_strany ks ON kn.nstrana = ks.vstrana AND kn.datum = ks.datum
UNION ALL
 SELECT 'kraje'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.kraje_kandidati kn
     left JOIN volby.kraje_strany_cr ks USING(kstrana, datum)
UNION ALL
 SELECT 'psp'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.psp_kandidati kn
     JOIN volby.psp_strany ks USING(kstrana, datum)
UNION ALL
 SELECT 'prezident'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ps.nazev_strn AS strana,
    kn.vek,
    kn.povolani,
    kn.zvolen_k1 = 1 OR kn.zvolen_k2 = 1 AS zvolen
   FROM volby.prezident_kandidati kn
     JOIN volby.prezident_strany ps ON kn.nstrana = ps.nstrana AND kn.datum = ps.datum;

kokes avatar Aug 30 '21 12:08 kokes

Nově s obvodem pro obce aspoň

SELECT 'senat'::text AS volby,
    (senat_kandidati.obvod || ' - '::text) || senat_obvody.nazev_obv AS obvod,
    senat_kandidati.datum,
    (senat_kandidati.jmeno || ' '::text) || senat_kandidati.prijmeni AS jmeno,
    senat_kandidati.nazev_vs AS strana,
    senat_kandidati.vek,
    senat_kandidati.povolani,
    senat_kandidati.zvolen_k1 = 1 OR senat_kandidati.zvolen_k2 = 1 AS zvolen
   FROM volby.senat_kandidati
     JOIN volby.senat_obvody USING (datum, obvod)
UNION ALL
 SELECT 'ep'::text AS volby,
    NULL::text AS obvod,
    ep_kandidati.datum,
    (ep_kandidati.jmeno || ' '::text) || ep_kandidati.prijmeni AS jmeno,
    ep_strany.nazevcelk AS strana,
    ep_kandidati.vek,
    ep_kandidati.povolani,
    ep_kandidati.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.ep_kandidati
     JOIN volby.ep_strany USING (datum, estrana)
UNION ALL
 SELECT 'obce'::text AS volby,
    knu.nazev AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.komunalni_kandidati kn
      -- inner joinem vynechame 35 vyskrtnutych kandidatu
     JOIN volby.komunalni_strany ks ON kn.nstrana = ks.vstrana AND kn.datum = ks.datum
     JOIN volby.komunalni_nuts knu ON knu.datum = kn.datum and knu.num_nuts = kn.okres
UNION ALL
 SELECT 'kraje'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.kraje_kandidati kn
     left JOIN volby.kraje_strany_cr ks USING(kstrana, datum)
UNION ALL
 SELECT 'psp'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ks.nazevcelk AS strana,
    kn.vek,
    kn.povolani,
    kn.mandat::bpchar = ANY (ARRAY['1'::bpchar, 'A'::bpchar]) AS zvolen
   FROM volby.psp_kandidati kn
     JOIN volby.psp_strany ks USING(kstrana, datum)
UNION ALL
 SELECT 'prezident'::text AS volby,
    NULL::text AS obvod,
    kn.datum,
    (kn.jmeno || ' '::text) || kn.prijmeni AS jmeno,
    ps.nazev_strn AS strana,
    kn.vek,
    kn.povolani,
    kn.zvolen_k1 = 1 OR kn.zvolen_k2 = 1 AS zvolen
   FROM volby.prezident_kandidati kn
     JOIN volby.prezident_strany ps ON kn.nstrana = ps.nstrana AND kn.datum = ps.datum;

kokes avatar Aug 10 '22 08:08 kokes