2016-07-29 23 views
1

Ich verwende SQL Server 2014. Ich muss Summen (Gesamtsumme) über einen Bereich von Daten aggregieren, die nach Kunde und Standort partitioniert oder gruppiert sind. Der Schlüssel ist, alle Anpassungsbeträge zu erhalten und sie so zusammenzufassen, wie sie für ein Rechnungstransaktionsdatum gelten.SQL Server-Aggregat über den Bereich von Daten

So müssen alle Anpassungen nach dem letzten Rechnungsdatum, aber weniger als das nächste Rechnungsdatum zusammenfassen und zusammen mit der Rechnungssumme präsentiert werden.

Siehe Beispiel:

+------------------+------------+------------+------------------+--------------------+ 
| TRANSACTION_TYPE | CUSTOMERID | LOCATIONID | TRANSACTION DATE | TRANSACTION AMOUNT | 
+------------------+------------+------------+------------------+--------------------+ 
| bill    | 215  | 102  | 7/7/2016   | $100.00   | 
| bill    | 215  | 102  | 6/6/2016   | $121.00   | 
| adj    | 215  | 102  | 6/1/2016   | $22.00    | 
| adj    | 215  | 102  | 5/8/2016   | $0.35    | 
| adj    | 215  | 102  | 5/7/2016   | $5.00    | 
| bill    | 215  | 102  | 5/6/2016   | $115.00   | 
| bill    | 215  | 102  | 4/7/2016   | $200.00   | 
| adj    | 215  | 102  | 4/2/2016   | $4.35    | 
| adj    | 215  | 102  | 4/1/2016   | $(0.50)   | 
| adj    | 215  | 102  | 3/28/2016  | $33.00    | 
| bill    | 215  | 102  | 3/28/2016  | $75.00    | 
| adj    | 215  | 102  | 3/5/2016   | $0.33    | 
| bill    | 215  | 102  | 3/3/2016   | $99.00    | 
+------------------+------------+------------+------------------+--------------------+ 

Was würde ich gerne sehen, ist die folgende:

+------------------+------------+------------+------------------+-------------+-------------------+ 
| TRANSACTION_TYPE | CUSTOMERID | LOCATIONID | TRANSACTION DATE | BILL AMOUNT | ADJUSTMENT AMOUNT | 
+------------------+------------+------------+------------------+-------------+-------------------+ 
| bill    | 215  | 102  | 7/7/2016   | $100.00  | $-    | 
| bill    | 215  | 102  | 6/6/2016   | $121.00  | $27.35   | 
| bill    | 215  | 102  | 5/6/2016   | $115.00  | $-    | 
| bill    | 215  | 102  | 4/7/2016   | $200.00  | $36.85   | 
| bill    | 215  | 102  | 3/28/2016  | $75.00  | $0.33    | 
| bill    | 215  | 102  | 3/3/2016   | $99.00  | $-    | 
+------------------+------------+------------+------------------+-------------+-------------------+ 

Antwort

0

Sie müssen:

  • zuerst die Tabelle als zwei (virtuellen) vorstellen Untertabellen, auf dem TransactionType;
  • Verwenden Sie dann die LEAD-Funktion, um den Datumsbereich der anzuwendenden Anpassungen zu ermitteln. und
  • schließlich eine Eft-Join durchführen.

Ungeprüfte SQL unten:

with 
BillData as (
    select 
     TransactionType, 
     CustomerID, 
     LocationID, 
     TransactionDate, 
     TransactionAmount, 
     lead(TransactionDate, 1) over (partition by CustomerID 
             order by TransactionDate) as NextDate 
    from @data bill 
    where TransactionType = 'bill' 
), 
AdjData as (
    select 
     CustomerID, 
     TransactionDate, 
     sum(TransactionAmount) as AdjAmount 
    from @data adj 
    where TransactionType = 'adj' 
) 
select 
    bill.TransactionType, 
    bill.CustomerID, 
    bill.LocationID, 
    bill.TransactionDate, 
    sum(TransactionAmount) as BillAmount, 
    sum(AdjAmount)   as AdjAmount 
from BillData bill 
left join AdjData adj 
    on adj.CustomerID = bill.CustomerID 
    and bill.TransactionDate <= adj.TransactionDate 
    and adj.TransactionDate < bill.NextDate 
group by 
    bill.TransactionType, 
    bill.CustomerID, 
    bill.LocationID, 
    bill.TransactionDate 
; 
+1

Vielen Dank für Ihre Hilfe. Die Abfrage hat nicht genau funktioniert, aber es hat mich in die richtige Richtung gebracht, also werde ich das als die richtige Antwort akzeptieren. Danke noch einmal! – shawno

0

Dies ist, was ich tun endete:

 select 
     bill.TransactionType, 
     bill.CustomerID, 
     bill.LocationID, 
     bill.TransactionDate, 
     TransactionAmount as BillAmount, 
     sum(AdjAmount)   as AdjAmount 
    from 
    (
     select 
      TransactionType, 
      CustomerID, 
      LocationID, 
      TransactionDate, 
      TransactionAmount, 
      lag(TransactionDate, 1) over (partition by CustomerID, LocationID 
              order by TransactionDate) as PreviousDate --NextDate 
     from test1 
     where TransactionType = 'bill' 
    ) as bill 
    left join 
    (
     select 
      CustomerID, 
      LocationID, 
      TransactionDate, 
      TransactionAmount as AdjAmount 
     from test1 
     where TransactionType = 'adj' 
    ) as adj 
    ON 
     adj.CustomerID = bill.CustomerID 
     and adj.LocationID = bill.LocationID 
    and adj.TransactionDate >= bill.PreviousDate 
    and adj.TransactionDate < bill.TransactionDate 
    group by 
     bill.TransactionType, 
     bill.CustomerID, 
     bill.LocationID, 
     bill.TransactionDate, 
     bill.TransactionAmount 
    order by 4 desc