2017-06-27 6 views
1

Ich versuche, alle Preise und Steuern nach Datumsbereich (nicht notwendig, das gleiche Datum) in 2 Spalten und Gruppen nach ID zu extrahieren. Weil ich von zwei anderen Spalten zu gruppieren müssen, weil T-SQL muß, dass:TSQL-Gruppe durch doppelte Zeile generieren

Spalte ‚...‘ in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion oder die GROUP BY enthalten sind Klausel.

Ich habe manchmal eine doppelte Benutzer/ID. (Weiß nicht, warum durch die Art und Weise ..)

Ich habe diese SQL:

WITH myQuery AS 
(
    Select 
     c.name, c.id, 
     CASE 
     WHEN g.dateCreated BETWEEN CAST ('2016-06-01 00:00:00.000' AS DATETIME) 
      AND CAST ('2017-05-31 23:59:59.000' AS DATETIME) 
     THEN SUM(CAST(g.price AS decimal(20,2))) 
     ELSE 0 
     END AS TOTAL_PRICE, 
     CASE 
     WHEN g.dateCreated BETWEEN CAST ('2016-01-01 00:00:00.000' AS DATETIME) 
      AND CAST ('2016-12-31 23:59:59.000' AS DATETIME) 
     THEN SUM(CAST(g.tax AS decimal(20,2))) 
     ELSE 0 
     END AS TOTAL_TAX 
    FROM customers c 
    inner join goodies g 
     ON c.id = g.customer_id 
    GROUP BY c.name, c.id, g.dateCreated 
) 
SELECT count(*) FROM myQuery 

Ich habe 5203 Zeilen. Ich habe nur 5031 Benutzer.

Wenn ich meine Daten analysiere, habe ich einige doppelte Daten.

Beispiel:

Alex, 12, 0.00, 0.00 
    Alex, 12, 100.00, 14.55 
Nancy, 4, 0.00, 0.00 
Arthur, 97, 48.14, 09.17 

ich zu einer Gruppe von id nur versucht, aber es scheint, dass ich das nicht tun kann.

Warum habe ich doppelte Daten und wie kann ich das verhindern und sicherstellen, dass ich eine Zeile von USER habe, auch wenn sie keine Goodies kaufen?

+1

Offensichtlich 'CUSTOMER_ID 12' hat mehr als eine gute Sachen, was auch immer Leckereien sind. Versuchen Sie 'SELECT * FROM Goodies WHERE customer_id = 12' und sehen Sie, ob Sie mehr als 1 Datensätze erhalten. – Eric

+1

Versuchen Sie, SUM außerhalb der CASE-Anweisung zu verschieben und g.dateCreated aus GROUP BY zu entfernen. – McNets

Antwort

2

Korrigieren Sie Ihre bedingte Aggregation und Entfernen dateCreated vom group by:

with myQuery as (
select 
    c.name 
    , c.id 
    , total_price = sum(case 
     when g.dateCreated >= '20160601' and g.dateCreated < '20170601' 
     then cast(g.price as decimal(20,2)) 
     else 0 
     end) 
    , total_tax = sum(case 
     when g.dateCreated >= '20160101' and g.dateCreated < '20170101' 
     then cast(g.tax as decimal(20,2)) 
     else 0 
     end) 
from customers c 
    left join goodies g 
    on c.id = g.customer_id 
group by 
    c.name 
    , c.id 
--, g.dateCreated 
) 
select count(*) from myQuery; 

die inner join zu einem left join Ändern kehrt customers auch wenn sie in goodies keine entsprechende Zeile haben.

Ich habe auch Ihren Datumsbereich geändert, um deutlicher zu machen, was enthalten ist.

Referenz:

Verwandte Themen