Ludwigmller
SQL-Guru
- Beiträge
- 172
Hallo,
ich möchte Daten unterschiedlicher Struktur in einer Übersicht kombiniert anzeigen. Siehe Beispiel im Anhang. Alle Daten sind raumspezifisch.
Die Daten sollen in einer ÜBersicht
1) je Raum für mehrere Tage
2) je Tag für mehrere (alle) Räume
3) graphisch je Raum über mehrere Tage
dargestellt werden. Die Abfrage sollte als Basis für alle Anwendungsfälle dienen, sodass keine Redundanzen vorhanden sind (bisher hab ich für 1)+2) jeweils seperaten Code).
Unten ein Ansatz. Ein Problem dabei ist, dass unterschiedliche Datentypen mit UNION kombiniert werden.
Die Struktur des Ergebnis ist:
Bei der Erstellung der HTML-Tabelle müsste man dann alle Werte der selben
Allgemein gefragt: wie kombiniere ich unterschiedliche Daten, die unterschiedlich abgefragt werden müssen in einem Ergebnis?
ich möchte Daten unterschiedlicher Struktur in einer Übersicht kombiniert anzeigen. Siehe Beispiel im Anhang. Alle Daten sind raumspezifisch.
Die Daten sollen in einer ÜBersicht
1) je Raum für mehrere Tage
2) je Tag für mehrere (alle) Räume
3) graphisch je Raum über mehrere Tage
dargestellt werden. Die Abfrage sollte als Basis für alle Anwendungsfälle dienen, sodass keine Redundanzen vorhanden sind (bisher hab ich für 1)+2) jeweils seperaten Code).
Unten ein Ansatz. Ein Problem dabei ist, dass unterschiedliche Datentypen mit UNION kombiniert werden.
Die Struktur des Ergebnis ist:
datum, raum_id, bezeichnung, wert, kategorie
Bei der Erstellung der HTML-Tabelle müsste man dann alle Werte der selben
kategorie
zeilenweise ausgeben. die bezeichnung
ist die Zeilenüberschirft.Allgemein gefragt: wie kombiniere ich unterschiedliche Daten, die unterschiedlich abgefragt werden müssen in einem Ergebnis?
SQL:
with
all_dates AS (
SELECT generate_series('2023-12-20'::date, '2023-12-24'::date, '1 day')::date AS datum
),
cte_parameter as(
select
p.id,
p.bezeichnung,
CASE
WHEN "isSetting" = true THEN 'Einstellungen'
ELSE 'Messwerte'
END AS kategorie
from
parameter as p
),
last_status AS (
SELECT
ad.datum,
sr.raum_id,
(
SELECT status_id
FROM lagerstatus_raum AS sr_inner
WHERE sr_inner.zeitstempel::date <= ad.datum
AND sr_inner.raum_id = sr.raum_id
ORDER BY sr_inner.zeitstempel::date DESC
LIMIT 1
) AS status_id
FROM
all_dates AS ad
CROSS JOIN (SELECT DISTINCT raum_id FROM lagerstatus_raum) AS sr
)
-- Messwerte und Einstellungen
select
pr.zeitstempel::date as datum,
pr.raum_id,
p.bezeichnung,
pr.wert,
p.kategorie
from
cte_parameter as p
LEFT JOIN parameter_raum as pr ON pr.parameter = p.id
where
pr.zeitstempel::date = '2023-12-24'
and pr.raum_id = 5
union
-- Kühlung
SELECT
fz.datum,
fz.raum_id,
Case
When fz.art = 1 then 'Kühlzeit'
when fz.art = 2 then 'Kühltakte'
when fz.art = 3 then 'Entfeuchtung'
end as bezeichnung,
fz.value_per_day,
'Kühlung' as kategorie
FROM
f_zaehler_pro_tag() fz
WHERE fz.datum >='2023-12-23'
UNION
-- Sonstiges (Status)
select ls.datum, ls.raum_id, 'Status' as bezeichnung, ls.status_id, 'Sonstiges' as kategorie
from last_status as ls
UNION
-- Sonstiges (Bemerkung)''
SELECT
a.datum,
b.raum_id,
'Bemerkung' as bezeichnung,
b.bemerkung ,
'Sonstiges' as kategorie
FROM
all_dates AS a
LEFT JOIN lagerung.bemerkung_raum AS b
ON a.datum = b.zeitstempel::date
GROUP BY a.datum,b.raum_id,b.bemerkung
ORDER BY a.datum ;