Auf freundlichen Hinweis hier noch die Folgeversion mit Anzahl fehlender Leistungen (siehe Hauptbeitrag):
DROP TABLE IF EXISTS tempLeistungsSummen;
CREATE TEMPORARY TABLE tempLeistungsSummen AS
SELECT
SUM(CASE WHEN e.code IN ('01410','01411','01412','01413','01415','01721','03062','03063','38100','38105') THEN l.anzahl ELSE 0 END) AS hausbesuche,
SUM(CASE WHEN e.code IN ('30980','30984','03360','03362','03370','03371','03372','03373','37300','37302','37305','37306','37314','37317') THEN l.anzahl ELSE 0 END) AS geri_palli,
SUM(CASE WHEN e.code IN ('37100','37102','37105','37113','37120') THEN l.anzahl ELSE 0 END) AS kooperation_pflegeheim,
SUM(CASE WHEN e.code LIKE '891%' OR e.code LIKE '883%' THEN l.anzahl ELSE 0 END) AS impfungen,
SUM(CASE WHEN e.code IN ('02300','02301','02302','02310','02311','02312','31600') THEN l.anzahl ELSE 0 END) AS chirurgie,
SUM(CASE WHEN e.code IN ('33012','33042') THEN l.anzahl ELSE 0 END) AS ultraschall,
SUM(CASE WHEN e.code IN ('03241','03321','03322','03324','03330') THEN l.anzahl ELSE 0 END) AS apparative_diagnostik,
SUM(CASE WHEN e.code = '01450' THEN l.anzahl ELSE 0 END) AS videosprechstunde,
SUM(CASE WHEN e.code IN ('03001','03002','03003','03004','03005') THEN l.anzahl ELSE 0 END) AS anzahl_03000
FROM leistung l
JOIN kvschein s ON l.invkvschein_ident = s.ident
JOIN patientendetailsrelationen_kvscheine pdr_s ON s.ident = pdr_s.kvscheine_ident
JOIN patientendetails pd ON pdr_s.patientendetailsrelationen_ident = pd.patientendetailsrelationen_ident
JOIN patient p ON pd.ident = p.patientendetails_ident
JOIN ebmkatalogeintrag e ON l.ebmkatalogeintrag_ident = e.ident
LEFT JOIN krankenkasse gk ON s.abgeleiteterkostentraeger_ident = gk.ident
WHERE
s.jahr = EXTRACT(YEAR FROM CURRENT_DATE)::int
AND s.quartal = EXTRACT(QUARTER FROM CURRENT_DATE)::int
AND (gk.kurzname IS NULL OR gk.kurzname = '' OR gk.kurzname NOT ILIKE '%knappschaft%')
AND l.visible = true
AND s.visible = true
AND l.dtype = 'EBMLeistung';
DROP TABLE IF EXISTS tempLeistungsSummenVorjahr;
CREATE TEMPORARY TABLE tempLeistungsSummenVorjahr AS
SELECT
SUM(CASE WHEN e.code IN ('03001','03002','03003','03004','03005') THEN l.anzahl ELSE 0 END) AS anzahl_03000_vorjahr
FROM leistung l
JOIN kvschein s ON l.invkvschein_ident = s.ident
JOIN patientendetailsrelationen_kvscheine pdr_s ON s.ident = pdr_s.kvscheine_ident
JOIN patientendetails pd ON pdr_s.patientendetailsrelationen_ident = pd.patientendetailsrelationen_ident
JOIN patient p ON pd.ident = p.patientendetails_ident
JOIN ebmkatalogeintrag e ON l.ebmkatalogeintrag_ident = e.ident
LEFT JOIN krankenkasse gk ON s.abgeleiteterkostentraeger_ident = gk.ident
WHERE
s.jahr = (EXTRACT(YEAR FROM CURRENT_DATE)::int - 1)
AND s.quartal = EXTRACT(QUARTER FROM CURRENT_DATE)::int
AND (gk.kurzname IS NULL OR gk.kurzname = '' OR gk.kurzname NOT ILIKE '%knappschaft%')
AND l.visible = true
AND s.visible = true
AND l.dtype = 'EBMLeistung';
DROP TABLE IF EXISTS tempZielwerte;
CREATE TEMPORARY TABLE tempZielwerte AS
SELECT
5 AS hausbesuche,
12 AS geri_palli,
1 AS kooperation_pflegeheim,
CASE WHEN EXTRACT(QUARTER FROM CURRENT_DATE) IN (1,2,3) THEN 7 ELSE 25 END AS impfungen,
3 AS chirurgie,
2 AS ultraschall,
3 AS apparative_diagnostik,
1 AS videosprechstunde;
SELECT
'Absolut' AS kategorie,
t.hausbesuche::text AS "Haus-/Heimbesuche",
t.geri_palli::text AS "Geri / Palli",
t.kooperation_pflegeheim::text AS "Kooperation Pflegeheim",
t.impfungen::text AS "Impfungen",
t.chirurgie::text AS "Chirurgie",
t.ultraschall::text AS "Ultraschall",
t.apparative_diagnostik::text AS "apparative Diagnostik",
t.videosprechstunde::text AS "Videosprechstunde",
t.anzahl_03000::text AS "Anzahl 03000",
v.anzahl_03000_vorjahr::text AS "Anzahl 03000 Vorjahr"
FROM tempLeistungsSummen t
CROSS JOIN tempLeistungsSummenVorjahr v
UNION ALL
SELECT
'Prozent zu 03000 aktuell',
ROUND((t.hausbesuche::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.geri_palli::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.kooperation_pflegeheim::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.impfungen::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.chirurgie::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.ultraschall::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.apparative_diagnostik::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
ROUND((t.videosprechstunde::numeric / NULLIF(t.anzahl_03000,0)) * 100,1)::text,
NULL,
NULL
FROM tempLeistungsSummen t
UNION ALL
SELECT
'Prozent zu 03000 Vorjahr',
ROUND((t.hausbesuche::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.geri_palli::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.kooperation_pflegeheim::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.impfungen::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.chirurgie::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.ultraschall::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.apparative_diagnostik::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
ROUND((t.videosprechstunde::numeric / NULLIF(v.anzahl_03000_vorjahr,0)) * 100,1)::text,
NULL,
NULL
FROM tempLeistungsSummen t
CROSS JOIN tempLeistungsSummenVorjahr v
UNION ALL
SELECT
'Ziel',
z.hausbesuche::text,
z.geri_palli::text,
z.kooperation_pflegeheim::text,
z.impfungen::text,
z.chirurgie::text,
z.ultraschall::text,
z.apparative_diagnostik::text,
z.videosprechstunde::text,
NULL,
NULL
FROM tempZielwerte z
UNION ALL
SELECT
'Ziel erreicht?',
CASE WHEN ROUND((t.hausbesuche::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.hausbesuche THEN '' ELSE '' END,
CASE WHEN ROUND((t.geri_palli::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.geri_palli THEN '' ELSE '' END,
CASE WHEN ROUND((t.kooperation_pflegeheim::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.kooperation_pflegeheim THEN '' ELSE '' END,
CASE WHEN ROUND((t.impfungen::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.impfungen THEN '' ELSE '' END,
CASE WHEN ROUND((t.chirurgie::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.chirurgie THEN '' ELSE '' END,
CASE WHEN ROUND((t.ultraschall::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.ultraschall THEN '' ELSE '' END,
CASE WHEN ROUND((t.apparative_diagnostik::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.apparative_diagnostik THEN '' ELSE '' END,
CASE WHEN ROUND((t.videosprechstunde::numeric / NULLIF(t.anzahl_03000,0)) * 100,1) >= z.videosprechstunde THEN '' ELSE '' END,
NULL,
NULL
FROM tempLeistungsSummen t
CROSS JOIN tempZielwerte z
UNION ALL
SELECT
'fehlende Leistungen (akt / Vorjahr)',
'(' || GREATEST(CEIL(z.hausbesuche/100.0 * t.anzahl_03000) - t.hausbesuche,0)::int || ' / ' || GREATEST(CEIL(z.hausbesuche/100.0 * v.anzahl_03000_vorjahr) - t.hausbesuche,0)::int || ')',
'(' || GREATEST(CEIL(z.geri_palli/100.0 * t.anzahl_03000) - t.geri_palli,0)::int || ' / ' || GREATEST(CEIL(z.geri_palli/100.0 * v.anzahl_03000_vorjahr) - t.geri_palli,0)::int || ')',
'(' || GREATEST(CEIL(z.kooperation_pflegeheim/100.0 * t.anzahl_03000) - t.kooperation_pflegeheim,0)::int || ' / ' || GREATEST(CEIL(z.kooperation_pflegeheim/100.0 * v.anzahl_03000_vorjahr) - t.kooperation_pflegeheim,0)::int || ')',
'(' || GREATEST(CEIL(z.impfungen/100.0 * t.anzahl_03000) - t.impfungen,0)::int || ' / ' || GREATEST(CEIL(z.impfungen/100.0 * v.anzahl_03000_vorjahr) - t.impfungen,0)::int || ')',
'(' || GREATEST(CEIL(z.chirurgie/100.0 * t.anzahl_03000) - t.chirurgie,0)::int || ' / ' || GREATEST(CEIL(z.chirurgie/100.0 * v.anzahl_03000_vorjahr) - t.chirurgie,0)::int || ')',
'(' || GREATEST(CEIL(z.ultraschall/100.0 * t.anzahl_03000) - t.ultraschall,0)::int || ' / ' || GREATEST(CEIL(z.ultraschall/100.0 * v.anzahl_03000_vorjahr) - t.ultraschall,0)::int || ')',
'(' || GREATEST(CEIL(z.apparative_diagnostik/100.0 * t.anzahl_03000) - t.apparative_diagnostik,0)::int || ' / ' || GREATEST(CEIL(z.apparative_diagnostik/100.0 * v.anzahl_03000_vorjahr) - t.apparative_diagnostik,0)::int || ')',
'(' || GREATEST(CEIL(z.videosprechstunde/100.0 * t.anzahl_03000) - t.videosprechstunde,0)::int || ' / ' || GREATEST(CEIL(z.videosprechstunde/100.0 * v.anzahl_03000_vorjahr) - t.videosprechstunde,0)::int || ')',
NULL,
NULL
FROM tempLeistungsSummen t
CROSS JOIN tempLeistungsSummenVorjahr v
CROSS JOIN tempZielwerte z;