2016-09-30 2 views
1

Mit folgenden SQL mit einem Join vorhanden:Aggregation gibt Ergebnis von 0, obwohl keine Daten

SELECT sum(r) AS amount 
FROM rep.stats 
JOIN rep.valdata 
    ON rep.valdata.id = rep.stats.data_id 
WHERE rep.valdata.custid = 3657 AND 
     rep.stats.sdatetime LIKE '2014-09-29%' 

Problem, mein ResultSet gibt mir eine Zeile als Ergebnis mit dem Wert 0, obwohl keine Daten verfügbar. Ich erwarte kein resultSet. Was ist los mit dir? Ist es, weil sum (r) eine 0 als Standard zurückgibt?

Das bringt mich in Schwierigkeiten, denn auch ein Wert von 0 ist ein Wert und wird angezeigt.

+1

Wo wird 'r' definiert? –

+1

Die Summe ist 0. Nichts ist falsch. – jarlh

+0

@Tim Biegeleisen: r ist in der Statistik-Tabelle definiert. – piet

Antwort

1

Ihre Abfrage ist eine Aggregationsabfrage ohne GROUP BY. Es handelt sich um eine Aggregationsabfrage, weil Sie eine Aggregationsfunktion (SUM()) in der select-Klausel haben.

Eine Aggregation Abfrage ohne group by behandelt alle Zeilen als Gruppe - und allen Mitteln alle, einschließlich keine. So eine Abfrage immer gibt genau eine Zeile zurück, die alle Zeilen zusammenfasst.

Das besagt, die Abfrage sollte nicht einen Wert von 0 zurückgeben. Es sollte eine einzelne Zeile mit einem Wert von NULL zurückgegeben werden.

Wenn Sie keine Zeile möchten, fügen Sie dann ein group by:

SELECT sum(r) AS amount 
FROM rep.stats s JOIN 
    rep.valdata v 
     ON v.id = s.data_id 
WHERE v.custid = 3657 AND 
     s.sdatetime >= '2014-09-29' AND 
     s.sdatetime < '2015-09-30' 
GROUP BY v.custid; 

Hinweise:

  • Die Aggregationsanfrage jetzt eine GROUP BY hat. Dies gibt eine Zeile pro Gruppe zurück, und wenn keine Gruppen vorhanden sind, werden keine Zeilen zurückgegeben.
  • Tabellenaliasnamen erleichtern das Schreiben und Lesen der Abfrage.
  • Verwenden Sie nicht LIKE mit Datum/Uhrzeit-Werten. Dazu müssen Datum/Uhrzeit in eine Zeichenfolge konvertiert werden, die von den Internationalisierungseinstellungen abhängen kann. Außerdem verhindert es die Verwendung von Indizes.
+0

Hallo Gordon, vielen Dank, du hast meinen Tag gerettet. Es funktioniert gut und wie erwartet. Und danke auch für den Hinweis auf Datetime-Probleme. – piet

Verwandte Themen