2016-07-29 5 views
1

Я использую SQL Server 2014. Мне нужно агрегировать итоговые суммы (сумма) в течение ряда дат, которые разбиты на разделы или сгруппированы по клиенту и местоположению. Ключ должен получить все суммы корректировки и суммировать их по мере их применения к дате выставления счетов.Объединение SQL Server по диапазону дат

Таким образом, все корректировки после последней даты счета, но меньше, чем следующая дата счета, должны быть подведены и представлены хорошо вместе с суммой счета.

См пример:

+------------------+------------+------------+------------------+--------------------+ 
| 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    | 
+------------------+------------+------------+------------------+--------------------+ 

То, что я хотел бы видеть, является следующее:

+------------------+------------+------------+------------------+-------------+-------------------+ 
| 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  | $-    | 
+------------------+------------+------------+------------------+-------------+-------------------+ 

ответ

0

Вам нужно:

  • первый зачать таблицу в виде двух (виртуальных) суб-таблицы, в TransactionType;
  • затем используйте функцию LEAD, чтобы получить диапазон дат корректировок; и
  • , наконец, выполнить соединение eft.

Непроверено SQL ниже:

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

Спасибо за вашу помощь. Запрос не работал точно, но он указал мне в правильном направлении, поэтому я буду принимать это как правильный ответ. Еще раз спасибо! – shawno

0

Это то, что я в конечном итоге делает:

 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 
Смежные вопросы