2016-06-24 2 views
3

У меня есть таблица с заказами, что является выглядит следующим образом:SQL сумма данных между 2 датами в одном столбце

t1

+-----------+---------+------------+ 
| client ID | order q | order date | 
+-----------+---------+------------+ 
|  01 | 100 | 01-02-2016 | 
|  01 | 350 | 03-05-2016 | 
+-----------+---------+------------+ 

И у меня есть вторая таблица с продаж:

t2

+-----------+-------+------------+ 
| client ID | sales | sales date | 
+-----------+-------+------------+ 
| 01  | 50 | 03-02-2016 | 
| 01  | 50 | 10-02-2016 | 
| 01  | 300 | 04-05-2016 | 
| 01  | 50 | 15-05-201 | 
+-----------+-------+------------+ 

Цель состоит в том, чтобы получить SUM продавецов больше, чем дату первого заказа и МЕНЬШЕ, чем дату второго заказа :

Результат

+-----------+---------+-------+ 
| cliend ID | order q | sales | 
+-----------+---------+-------+ 
| 01  | 100  | 100 | 
| 01  | 350  | 350 | 
+-----------+---------+-------+ 

Первая идея заключается в том, чтобы сделать оценку даты заказа как

DENSE_RANK() OVER(PARTITION BY [client ID] ORDER BY [order date] ASC) AS R 

затем сделать что-то вроде этого:

select 
    client ID, 
    order q, 
    sum (sales) as sales 
from 
    t2 
left outer join 
    t2.client ID = t1.client ID 
where 
    [sales date] >= [order date] 
    and [sales date] <= [order date] in (select [order date] 
             from t2 
             where (R < (R+1))) 
group by 
    client ID, order q 

Я знаю, что это неправильно, но это логика в моей голове.

Не могли бы вы дать мне некоторые идеи, как это сделать?

+1

Предоставьте также данные испытаний – TheGameiswar

ответ

1

Похоже сумму между датами. Я предполагаю, что включает текущую дату заказа, исключая дату следующего заказа.

select t.clientID, fromdate, sum(sales) 
from (
    select clientID,orderq 
     , fromdate = orderdate 
     , todate = dateadd(dd, -1, lead(orderdate,1,cast('2100-01-01' as date)) over(partition by clientID order by orderdate)) 
    from(
      values 
      (01,100,cast('2016-02-01' as date)), 
      (01,350,cast('2016-05-03' as date)) 
     ) orders(clientID,orderq,orderdate) 
    ) t 
join( 
     values 
     (01,50 ,cast('2016-02-03' as date)), 
     (01,50 ,cast('2016-02-10' as date)), 
     (01,300 ,cast('2016-05-04' as date)), 
     (01,50 ,cast('2016-05-15' as date)) 
    ) sales(clientID, sales,salesdate) 
    on sales.salesdate between fromdate and todate 
group by t.clientID, fromdate 
+0

Работы! Большой ! спасибо –

0

Попробуйте это:

;WITH CTE AS (
    SELECT [client ID], [order q], [order date],   
     COALESCE(LEAD([order date]) OVER (PARTITION BY [client ID] 
              ORDER BY [order date]), 
       '2100-01-01') AS Next_Date 
    FROM t1 
) 
SELECT t1.[client ID], t1.[order q], t2.sales 
FROM CTE AS t1 
CROSS APPLY (
    SELECT [client ID], SUM(sales) AS sales 
    FROM t2 
    WHERE [sales date] > t1.[order date] AND [sales date] < t1.Next_Date 
    GROUP BY [client ID]) AS t2 

Demo here

Смежные вопросы