[volby] připravit dobrý view s přehledem kandidátů napříč volbami
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:
- Volební koalice (TOPSTAN do EP, SPOLU/PirSTAN do PSP
- TSS, což neni koalice, ale nová strana do voleb (Trikolóra a spol., PSP 2021)
- BEZPP nějak dobře zakódován
- 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;
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;
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;