2016-08-04 11 views
4

Ich muss aggregieren Amounts, um nach Datumsbereich pro Monat angezeigt werden. Zur Veranschaulichung bitte einen Blick auf die folgende Tabelle nehmen:Aggregieren mehrerer Spalten basierend auf einem bestimmten Datumsbereich mit einem Monat

Invoice_Payment

Customer_id Invoice_no Invoice_date Amount 
--------------------------------------------------- 
10    10023   2016-07-08  60 
10    10018   2016-08-04  90 
11    10016   2016-07-01  110 
11    10021   2016-07-05  120 
12    10028   2016-07-11  10 
12    10038   2016-07-31  5 

Wie Sie bemerken, ich gruppieren wollen, dass sie basierend auf Customer_id und zeigt die Daten als Anfang bis Ende. Außerdem muss dies nur für jeden Monat gemacht werden.

Nach Abfrage, die ich bisher versucht habe:

select Customer_id, (mindate + ' to ' + maxdate) Date_Range, Amount 
from (
    select Customer_id, sum(Amount) Amount, min(Invoice_date) mindate, max(Invoice_date) maxdate 
    from Invoice_Payment 
    group by Customer_id 
    ) I ; 

Von oben Abfrage erhalte ich Output wie:

Customer_id Date_Range     Amount 
10    2016-07-08 to 2016-08-04  150 
11    2016-07-01 to 2016-07-05  230 
12    2016-07-11 to 2016-07-31  15 

Bitte überprüfen Sie dies .. SQL Fiddle Working Demo

Lassen Sie uns sagen Customer_id = 10 Wer hat Invoice_date in July,2016 und August,2016. Ich muss alle Zahlungen dieses bestimmten Kunden für den Monat Juli und August getrennt innerhalb eines bestimmten Datumsbereichs zusammenfassen. Aber ich bekomme eine Summe von Amount von allen Invoice_date von oben Bestreben.

gewünschte Ausgabe:

Customer_id Date_Range     Amount 
10    2016-07-08 to 2016-07-08  60 
10    2016-08-04 to 2016-08-04  90 
11    2016-07-01 to 2016-07-05  230 
12    2016-07-11 to 2016-07-31  15 

Wie könnte ich darüber hinwegkommen? Jede Hilfe würde sehr geschätzt werden.

Antwort

2

Sie fast fertig sind. Füge einfach YEAR und MONTH zu GROUP BY hinzu.

select Customer_id, (mindate + ' to ' + maxdate) Date_Range, Amount 
from (
     select Customer_id, 
     sum(Amount) Amount, min(Invoice_date) mindate, max(Invoice_date) maxdate 
     from #Invoice_Payment 
group by 
    Customer_id, 
    YEAR(Invoice_date), 
    MONTH(Invoice_date) 
) I ; 
2

Wie wäre es Gruppierung von customer_id, Monat und Jahr

select Customer_id, (mindate + ' to ' + maxdate) Date_Range, Amount 
from (
     select Customer_id, 
     sum(Amount) Amount, min(Invoice_date) mindate, max(Invoice_date) maxdate 
     from #Invoice_Payment 
     group by Customer_id,month(Invoice_date), year(Invoice_date) 
) I 
order by customer_id; 
+0

Es funktioniert jetzt gut danke! –