2017-01-15 19 views
1

Ich versuche, von meinem Tisch alle Rechnungen für diejenigen Kunden, die mehr als 1000 über den Zeitraum der letzten 12 Monate ausgegeben erhoben. Unten ist mein Tisch nur für zwei Kunden als Beispiel:SQL - CASE WHEN Frage

enter image description here

Und meine Frage: INV

SELECT 
    t.Customer, t.Invoice 
FROM 
    (SELECT 
     CI.Customer, CI.Invoice, CI.Date, 
     SUM(CASE 
       WHEN CI.Date > DATEADD(month, -12, getdate()) 
        THEN CI.Valuee 
       ELSE 0 
      END) as Net 
    FROM 
     CustomerInvoice CI 
    GROUP BY 
     CI.Customer, CISRV.Invoice, CISRV.Date) AS t 
GROUP BY 
    t.Customer, t.Invoice 
HAVING 
    SUM (t.Net) > 1000 

Als Ergebnis werde ich nur Rechnung INV-341453 bekommen, aber ich würde auch zeigen, wie Rechnungen -346218 und INV-349065.

Was mache ich falsch?

Antwort

1

ANSI-Standard-Fensterfunktionen:

select ci.* 
from (select ci.*, 
      sum(ci.value) over (partition by ci.customer) as total_value 
     from CustomerInvoice CI 
     where CI.Date > DATEADD(month, -12, getdate()) 
    ) ci 
where total_value > 1000; 

Mit "alle Rechnungen", ich nehme an, Sie die, die in den vergangenen zwölf Monaten bedeuten.

+0

Dank Gordon Es funktioniert! Sehr gute Lösung und einfacher Code. Erfahren Sie mehr über OVER-Klausel .. – kikos87

0

Sie können dies tun, indem Sie eine gruppierte Abfrage mit den Kunden zu identifizieren, die über die Schwelle von 1000 gegangen sind, und dann für die Kunden alle Rechnungen anzuzeigen:

SELECT Customer, Invoice 
FROM CustomerInvoice 
WHERE Customer IN 
    (SELECT Customer 
    FROM CustomerInvoice 
    GROUP BY Customer 
    HAVING SUM(CASE WHEN CI.Date>DATEADD(month,-12,getdate()) THEN CI.Valuee ELSE 0 END) > 1000)