Hallo zusammen,
ich habe hier eine Abfrage, bei der ich auch wenn kein Datensatz zurück gegeben wird, eine Ausgabe benötige.
Ich brauche also immer einen Wert für DAY, MONTH und WEEK
Ich habe es mit CASE WHEN NOT NULL, mir ist auch relativ klar das es nicht gehen kann, da NULL ja auch ein Datensatz ist.
Kann mir jemand helfen wie die Lösung ausschauen könnte?
Vielen Dank schon mal!
((SELECT
'DAY' as period,
aoi_kopfdaten.t_system,
CASE
WHEN count(*) IS NOT NULL THEN
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
ELSE 0
END
as fpy
FROM aoi_kopfdaten
WHERE EXTRACT(DAY FROM (t_datum)) = EXTRACT(DAY FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system)
UNION
(SELECT
'WEEK' as period,
aoi_kopfdaten.t_system,
CASE
WHEN count(*) IS NOT NULL THEN
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
ELSE 0
END
as fpy_day
FROM aoi_kopfdaten
WHERE EXTRACT(WEEK FROM (t_datum)) = EXTRACT(WEEK FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system)
UNION
(SELECT
'MONTH' as period,
aoi_kopfdaten.t_system,
CASE
WHEN count(*) IS NOT NULL THEN
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
ELSE 0
END
as fpy_day
FROM aoi_kopfdaten
WHERE EXTRACT(MONTH FROM (t_datum)) = EXTRACT(MONTH FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system))
ORDER BY t_system,period asc
Du könntest Dummy Datensätze selektieren wenn die eigentlich Abfrage nichts liefert:
with real_data as (
... Deine originale Abfrage kommt hier hin ...
), dummy_data (period, system,fpy) as (
values
('DAY',null,null),
('MONTH',null,null),
('WEEK',null,null),
)
select *
from real_data
union all
select *
from dummy_data
where not exists (select * from real_data);
Hallo castorb, erst mal vielen Dank für die schnelle Antwort…
die Lösung hört sich perfekt für mein Problem an, ich es umgesetzt, und nach ein paar kleineren Fehlern,
auch eine Ausgabe bekommen, nur leider immer noch mit zwei fehlenden Datensätzen
with real_data as (
((SELECT
'DAY' as period,
aoi_kopfdaten.t_system as system,
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
as fpy
FROM aoi_kopfdaten
WHERE EXTRACT(DAY FROM (t_datum)) = EXTRACT(DAY FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system)
UNION
(SELECT
'WEEK' as period,
aoi_kopfdaten.t_system as system,
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
as fpy
FROM aoi_kopfdaten
WHERE EXTRACT(WEEK FROM (t_datum)) = EXTRACT(WEEK FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system)
UNION
(SELECT
'MONTH' as period,
aoi_kopfdaten.t_system as system,
float4((
(cast(100 as float)/cast(count(*) as float))
* cast((sum(case when anz_unclassified = 0 then 1 else 0 end)) as float)
)/100)
as fpy
FROM aoi_kopfdaten
WHERE EXTRACT(MONTH FROM (t_datum)) = EXTRACT(MONTH FROM NOW())
GROUP BY aoi_kopfdaten.t_system
ORDER BY aoi_kopfdaten.t_system))
ORDER BY system,period asc
), dummy_data (period, system,fpy) as (
values
('DAY',null,0),
('MONTH',null,0),
('WEEK',null,0)
)
select *
from real_data
union all
select *
from dummy_data
where not exists (select * from real_data);
Dann musst Du zuerst eine Liste aller t_system/period Kombinationen aufbauen und dann das Ergebnis Deiner Abfrage mit einem outer join verbinden:
Sowas in der Art:
with real_data as (
... Deine originale Abfrage kommt hier hin ...
), all_systems (t_system, period) as (
select kd.t_system, v.period
from (
select distinct t_system
from aoi_kopfdaten
) kd
cross join (values ('DAY'), ('WEEK'), ('MONTH')) as v(period)
)
select *
from all_systems s
left join real_data rd on (rd.t_system, rd.period) = (s.t_system, s.period)