2017-01-16 3 views
0

ich diese Tabelle habenExtract Datum-by-date Werte auch wenn keine Daten

records 
- id 
- date 
- typology 

Ich möchte einen Tag-für-Tag extrahieren Anzahl der Datensätze mit Typologie = 999. Ich weiß, dass es mindestens 1 Datensatz für jeden Tag, aber die meisten Tage habe ich nicht einen Datensatz mit Typologie 999.

ich so etwas wie

versucht
select count(*) from records where typology = 999 and date > '2017-01-01' group by date order by date asc; 

der Hoffnung, so etwas wie

zu bekommen
285 | 2017-01-06 | 
307 | 2017-01-07 | 
    0 | 2017-01-08 | 
316 | 2017-01-09 | 

aber ich nicht. Ich bekomme

285 | 2017-01-06 | 
307 | 2017-01-07 | 
316 | 2017-01-09 | 

und das ist richtig. Da es am 8. Januar keine Aufzeichnungen mit der Typologie 999 gibt, bekomme ich diese Zeile nicht. Aber ich würde gerne. Ich muss das Datum 2017-01-08 nicht "erfinden", es gibt sicher Aufzeichnungen mit diesem Datum (aber andere Typologien).

Ich versuchte ein bisschen mit Coalesce und Unterabfragen, aber konnte nicht viel draus machen, vor allem, weil ich zwei Felder habe und koalesce scheint mir mit nur einem gut zu funktionieren.

ich mit einem CASE versuchte auch

SELECT CASE c WHEN NULL THEN 0 ELSE c END 
FROM (
select count(*) as c from records where typology = 892 and date > '2017-01-01' group by date order by date asc 
) as s; 

auch nicht funktioniert. Ich bin mir ziemlich sicher, dass es eine ziemlich verwirrte Abfrage ist.

Haben Sie zufällig einen Vorschlag für mich?

Danke Marco

+2

'Kalender Tisch + LEFT JOIN + count' –

Antwort

1

Try this:

select t.date, 
    count(r.date) 
from records r 
right join 
    (select date from records where date > '2017-01-01' group by date 
) t 
on r.date  = t.date 
and r.typology = 999 
group by t.date 
order by t.date asc; 
+0

Vielen Dank, Ihre Lösung zu bearbeiten, ich habe es geschafft zu finden, was ich gesucht habe. Dies ist die letzte Abfrage, die ich verwenden: select t.dateField, count (*) von Aufzeichnungen rechts r \t (select DATE (Datum) als datefield \t von Aufzeichnungen \t wo Datum> '2016.12.01' beitreten \t Gruppe nach Datum (Datum)) t am DATE (r.date) = t.dateField und r.typology = 999 Gruppe von t.dateField Ordnung von t.dateField asc; –

+0

Ich änderte die erste Zählung (Datum) in die Zählung (*), weil ich auch 1 bekam, wo die Anzahl der Datensätze 0 war –

+0

@Marco Nice one! – GurV

1

Sie generate_series können alle Termine zwischen festgelegten Start- und Ende zu erzeugen. Dann left join auf diese 0 zählt für fehlende Daten.

select d.dt,coalesce(r.cnt,0) as cnt  
from (select * 
     from generate_series('2017-01-02'::date,'2017-12-31'::date,'1 day') as dt) d 
    --change the start and end date,interval in generate_series as required 
left join (select date,count(*) as cnt 
      from records 
      where typology = 892 and date > '2017-01-01' 
      group by date) r 
on r.date=d.dt 
+0

Es funktioniert wahrscheinlich, aber ich mochte die andere Lösung besser, da es nicht coalesce und generate_series zu verwenden ist. Das ist aber interessant. Vielen Dank! –

Verwandte Themen