好的,经过反复试验和逻辑思考,我设法将一个有效的查询放在一起,我只是使用INNER JOIN 来始终组合不同表之间的匹配条件。
最终结果是这样的(不要介意德语描述等)
SELECT
"Fall",
"Vorname",
"Name",
"Geburtsdatum",
"Aufnahmedatum",
"Befundzeitpunkt Aufnahme",
"Erhebungart A",
"Dekubitus vorh. b. Aufn." ,
"Befundzeitpunkte Folgeerhebungen",
"Erhebungsart F",
"Dekubitus vorh. b. Folgeerh."
FROM (
SELECT DISTINCT
t1."Fall",
t1."Vorname",
t1."Name",
t1."Geburtsdatum",
t1."Aufnahmedatum",
t1."Befundzeitpunkt Aufnahme",
t1."Erhebungsart" AS "Erhebungart A",
t2."Flag" AS "Dekubitus vorh. b. Aufn.",
LISTAGG(t3."Befundzeitpunkt Folgeerhebung", ', ') WITHIN GROUP (ORDER BY t3."Befundzeitpunkt Folgeerhebung") OVER (PARTITION BY t1."Fall") AS "Befundzeitpunkte Folgeerhebungen",
t3."Erhebungsart" AS "Erhebungsart F",
t4."Flag" AS "Dekubitus vorh. b. Folgeerh."
FROM
/* Checkbox "Dekubituserhebung zur Aufnahme" = TRUE */
(SELECT DISTINCT
f.FALLNR AS "Fall",
np.VORNAME AS "Vorname",
np.NAME AS "Name",
TO_CHAR(np.GEBDAT, 'DD.MM.YYYY') AS "Geburtsdatum",
TO_CHAR(f.AUFNDAT, 'DD.MM.YYYY') AS "Aufnahmedatum",
CONCAT(CONCAT(TO_CHAR(cp.MEDDATE, 'DD.MM.YYYY'), ' '), TO_CHAR(cp.MEDTIME, 'HH24:MI')) AS "Befundzeitpunkt Aufnahme",
DECODE(cf2.FLAG, 0, 'Nein', 1, 'Ja') AS "Flag",
DECODE(cf3.CODE, 'cbxDekuZurAufnahme', 'Ersterhebung') AS "Erhebungsart"
FROM
OS_CW.CW_PRIMITIVUM cp
INNER JOIN FALL f ON f.FALLID = cp.FALL
INNER JOIN NATPERSON np ON f.PERSNR = np.PERSNR
INNER JOIN OS_CW.CW_KLASSE ck ON ck.NUMMER = cp.KLASSE
LEFT JOIN OS_CW.CW_FELDTEXT cf ON cf.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDDATEN cf2 ON cf2.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDCODE cf3 ON cf3.NUMMER = cf2.FELDDEFINITION
WHERE
ck.MAPPENNUMMER = 16
AND f.MEDICALCASESTATE IN (65366, 65369)
AND f.CASEMARK IN (38140, 38142)
AND EXTRACT(YEAR FROM f.ENTLDAT) = 2021
AND cp.STORNIERT = 0
AND (cf3.CODE = 'cbxDekuZurAufnahme' AND cf2.FLAG = 1)
) t1
INNER JOIN
/* Checkbox "Dekubituserhebung zur Aufnahme" = TRUE UND Checkbox "Dekubitus vorhanden" = FALSE - kein Dekubitus bei Aufnahmeerehbung */
(SELECT DISTINCT
f.FALLNR AS "Fall",
CONCAT(CONCAT(TO_CHAR(cp.MEDDATE, 'DD.MM.YYYY'), ' '), TO_CHAR(cp.MEDTIME, 'HH24:MI')) AS "Befundzeitpunkt Aufnahme",
DECODE(cf2.FLAG, 0, 'Nein', 1, 'Ja') AS "Flag",
DECODE(cf3.CODE, 'cbxDekubitusVorhanden', 'Dekubitus vorhanden') AS "Dekubitus vorhanden"
FROM
OS_CW.CW_PRIMITIVUM cp
INNER JOIN FALL f ON f.FALLID = cp.FALL
INNER JOIN OS_CW.CW_KLASSE ck ON ck.NUMMER = cp.KLASSE
LEFT JOIN OS_CW.CW_FELDTEXT cf ON cf.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDDATEN cf2 ON cf2.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDCODE cf3 ON cf3.NUMMER = cf2.FELDDEFINITION
WHERE
ck.MAPPENNUMMER = 16
AND f.MEDICALCASESTATE IN (65366, 65369)
AND f.CASEMARK IN (38140, 38142)
AND EXTRACT(YEAR FROM f.ENTLDAT) = 2021
AND cp.STORNIERT = 0
AND (cf3.CODE = 'cbxDekubitusVorhanden' AND cf2.FLAG = 0)
) t2
ON t1."Fall" = t2."Fall"
AND t1."Befundzeitpunkt Aufnahme" = t2."Befundzeitpunkt Aufnahme"
INNER JOIN
/* Checkbox "Dekubituserhebung als Folgeerhebung" = TRUE */
(SELECT DISTINCT
f.FALLNR AS "Fall",
CONCAT(CONCAT(TO_CHAR(cp.MEDDATE, 'DD.MM.YYYY'), ' '), TO_CHAR(cp.MEDTIME, 'HH24:MI')) AS "Befundzeitpunkt Folgeerhebung",
DECODE(cf2.FLAG, 0, 'Nein', 1, 'Ja') AS "Flag",
DECODE(cf3.CODE, 'cbxDekuFolgeerhebung', 'Folgeerhebung') AS "Erhebungsart"
FROM
OS_CW.CW_PRIMITIVUM cp
INNER JOIN FALL f ON f.FALLID = cp.FALL
INNER JOIN OS_CW.CW_KLASSE ck ON ck.NUMMER = cp.KLASSE
LEFT JOIN OS_CW.CW_FELDTEXT cf ON cf.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDDATEN cf2 ON cf2.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDCODE cf3 ON cf3.NUMMER = cf2.FELDDEFINITION
WHERE
ck.MAPPENNUMMER = 16
AND f.MEDICALCASESTATE IN (65366, 65369)
AND f.CASEMARK IN (38140, 38142)
AND EXTRACT(YEAR FROM f.ENTLDAT) = 2021
AND cp.STORNIERT = 0
AND (cf3.CODE = 'cbxDekuFolgeerhebung' AND cf2.FLAG = 1)
) t3
ON t1."Fall" = t3."Fall"
AND t2."Fall" = t3."Fall"
INNER JOIN
/* Checkbox "Dekubituserhebung als Folgeerhebung" = TRUE UND Checkbox "Dekubitus vorhanden" = TRUE - Dekubitus während Aufenthalt entwickelt */
(SELECT DISTINCT
f.FALLNR AS "Fall",
CONCAT(CONCAT(TO_CHAR(cp.MEDDATE, 'DD.MM.YYYY'), ' '), TO_CHAR(cp.MEDTIME, 'HH24:MI')) AS "Befundzeitpunkt Folgeerhebung",
DECODE(cf2.FLAG, 0, 'Nein', 1, 'Ja') AS "Flag",
DECODE(cf3.CODE, 'cbxDekubitusVorhanden', 'Dekubitus vorhanden') AS "Dekubitus vorhanden"
FROM
OS_CW.CW_PRIMITIVUM cp
INNER JOIN FALL f ON f.FALLID = cp.FALL
INNER JOIN OS_CW.CW_KLASSE ck ON ck.NUMMER = cp.KLASSE
LEFT JOIN OS_CW.CW_FELDTEXT cf ON cf.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDDATEN cf2 ON cf2.PRIMITIVUMNUMMER = cp.PRIMITIVUMNUMMER
LEFT JOIN OS_CW.CW_FELDCODE cf3 ON cf3.NUMMER = cf2.FELDDEFINITION
WHERE
ck.MAPPENNUMMER = 16
AND f.MEDICALCASESTATE IN (65366, 65369)
AND f.CASEMARK IN (38140, 38142)
AND EXTRACT(YEAR FROM f.ENTLDAT) = 2021
AND cp.STORNIERT = 0
--AND CONCAT(CONCAT(TO_CHAR(cp.MEDDATE, 'DD.MM.YYYY'), ' '), TO_CHAR(cp.MEDTIME, 'HH24:MI')) = '16.09.2020 16:47'
AND (cf3.CODE = 'cbxDekubitusVorhanden' AND cf2.FLAG = 1)
) t4
ON t3."Befundzeitpunkt Folgeerhebung" = t4."Befundzeitpunkt Folgeerhebung"
AND t3."Fall" = t4."Fall"
)
ORDER BY "Aufnahmedatum", "Fall", TO_DATE("Befundzeitpunkt Aufnahme", 'DD.MM.YYYY HH24:MI')