WENN kein Datansatz zurück gegeben wird...dann

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 :frowning:

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);

legdaa0_LEGNB0859_2024-02-20-000054
, siehst du vielleicht das Problem?

Grüße

Andreas

Das Problem tritt offenbar innerhalb Deines Select Statements auf, nicht in der Ergänzung für “ganz leeres Ergebnis”

Hmm, kann es sein, dass Du für jeden Wert von system immer drei Zeilen (day, month, week) haben wills?

ja genau, sprich die Liste muss immer vollständig sein, auch wenn es mal keine Daten gibt

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)

Guten Morgen castorp,
ich danke dir sehr !
Es funktioniert einwandfrei! :slight_smile:

Viele Grüße
Andreas