2016-03-24 7 views
1

Ich habe eine Tabelle mit POS-Transaktionsdaten und versuche, einige unserer Kaufinformationen zu aggregieren. Ein Beispiel könnte wie aussehenBehandeln von fehlenden Paaren als Null bei der Berechnung eines Durchschnitts in SQL

pID (int) | pDate (varchar) | pAmount(numeric) | pCode(varchar) 
1   | 01-NOV-14  | 12.67   | ELECTRONIC 
2   | 01-NOV-14  | 61.89   | HOUSEWARE 
3   | 01-NOV-14  | 52.25   | ELECTRONIC 
4   | 02-NOV-14  | 9.12    | HOUSEWARE 
5   | 02-NOV-14  | 17.11   | ELECTRONIC 
6   | 03-NOV-14  | 39.88   | HOUSEWARE 
7   | 03-NOV-14  | 21.60   | ELECTRONIC 
8   | 03-NOV-14  | 16.78   | HOUSEWARE 
9   | 04-NOV-14  | 47.29   | HOUSEWARE 

Mein Ziel ist es, den durchschnittlichen täglichen Verkaufsbetrag zu berechnen, gruppiert nach Kategorie. Mein Problem ist, dass es eine inkonsistente Anzahl von Verkaufseinträgen pro Tag gibt. Daher muss ich die tägliche Summe für jede Kategorie vor der Aggregation abrufen.

Für dieses Beispiel mein Ziel wäre eine Abfrage sein, die den Tagesdurchschnitt erzeugt, durch Code gruppiert:

SalesItem | AverageDailySales 
ELECTRONIC | 25.91 
HOUSEWARE | 43.74 

Aber, weil nicht alle Tage haben Verkäufe für alle Kategorien, die tägliche Summe pro Kategorie zu berechnen und die durchschnittliche Einnahme wird nicht funktionieren: die Abfrage

SELECT s.pCode AS SalesItem, TO_CHAR(AVG(s.TotalDaySales), '999.99') AS AverageDailySales 
FROM (SELECT t.pDate, t.pCode, SUM(t.pAmount) as TotalDaySales 
     FROM Pos_Transactions t 
     GROUP BY t.pDate, t.pCode) s 
GROUP BY s.pCode ORDER BY s.pCode; 

Ausbeuten

SalesItem | AverageDailySales 
ELECTRONIC | 34.54 
HOUSEWARE | 43.74 

, was die Tatsache ausschließt, dass am 4. November keine elektronischen Verkäufe getätigt wurden und ein höherer durchschnittlicher Verkauf pro Tag impliziert.

Wie kann ich mit den fehlenden Einträgen bei der Berechnung mit AVG umgehen?

Antwort

1

Ein Ansatz ist nicht AVG zu verwenden, sondern die Teilung selbst zu tun:

SELECT t.pCode, 
     TO_CHAR(SUM(t.pAmount) 
       /(SELECT COUNT(DISTINCT t2.pDate) FROM Pos_Transactions t2), 
       '999.99') 
     as AverageDailySales 
    FROM Pos_Transactions t 
GROUP BY t.pCode 
ORDER BY t.pCode; 
+0

Perfect - Aufruf unterscheidet sich von einer verschachtelten Abfrage das Problem mit vkp Antwort festgelegt (wo die Gruppe von nahm precendence) – user2093082

Verwandte Themen