Joda: SQL Count

Hallo zusammen,

ich eine SQL-Proble.

Folgende Tabelle hab ich:

Seriennummer,Datum,value
001,2009-11-20,value
001,2009-11-20,value
001,2009-11-21,value
001,2009-11-22,value
002,2009-11-20,value
002,2009-11-20,value
002,2009-11-20,value
003,2009-11-20,value
003,2009-11-21,value
...

Was ich nun möchte ist eine Ausgabe die mir die Anzahl von Datensätzen je Tag zeigt -  wenn eine Seriennummer mal einen Tag keinen Datensatz hat, dann soll es 0 zeigen.
Also will ich:

  
+----------------+----------------+----------+  
| serialnumber   | date 		  | count(*) |  
+----------------+----------------+----------+  
| 001            | 2009-11-20     |    2	 |  
| 001			 | 2009-11-21     |    1	 |  
| 001			 | 2009-11-22     |    1	 |  
| 002			 | 2009-11-20     |    3	 |  
| 002			 | 2009-11-21     |    0	 |  
| 002			 | 2009-11-22     |    0	 |  
| 003			 | 2009-11-20     |    1	 |  
| 003			 | 2009-11-21     |    1	 |  
| 003			 | 2009-11-22     |    0	 |

Mit folgendem Select:
SELECT serialnumber,date,count(*) FROM Tabelle group by serialnumber, date;

Bekomme ich die Daten, jedoch ohne die 0 counts.

+----------------+----------------+----------+  
| serialnumber   | date 		  | count(*) |  
+----------------+----------------+----------+  
| 001            | 2009-11-20     |    2	 |  
| 001			 | 2009-11-21     |    1	 |  
| 001			 | 2009-11-22     |    1	 |  
| 002			 | 2009-11-20     |    3	 |  
| 003			 | 2009-11-20     |    1	 |  
| 003			 | 2009-11-21     |    1	 |

Wie bekomme ich das hin?
Danke.

ciao,
Joda

  1. Hi!

    wenn eine Seriennummer mal einen Tag keinen Datensatz hat, dann soll es 0 zeigen.

    Ein DBMS ist dazu da, vorhandene Daten abzufragen. Nicht vorhandene Daten kann es nicht liefern.

    Wie bekomme ich das hin?

    Wenn es für jede Seriennummer mindestens einen Datensatz gibt und für ein Datum ebenfalls, dann kannst du mit einer Self-Join-Orgie etwas zaubern. Wenn du Datum und Seriennummer von anderen Quellen lückenlos bekommst, bekommst du ein genaueres Ergebnis.

    Zunächst bildest du aus allen eindeutigen Seriennumemrn und allen eindeutigen Datümern™ ein kartesisches Produkt, an das du dann per LEFT JOIN über Seriennummer und Datum die eigentliche Tabelle anbindest. Diese gruppierst du nach Seriennummer und Datum. In der Select-Klausel kann dann Seriennummer, Datum und die gezählte Anzahl stehen. (Mit anderen Quellen für Seriennummer und Datum bildest du das kartesische Produkt aus diesen.)

    SELECT s.serialnumber, d.date, count(t.value)  
    FROM  
      (  
        (SELECT DISTINCT serialnumber FROM table) s,  
        (SELECT DISTINCT date FROM table) d  
      ) LEFT JOIN table t ON s.serialnumber = t.serialnumber AND d.date = t.date  
    GROUP BY s.serialnumber, d.date
    

    Lo!