2016-06-24 15 views
3

ich eine Tabelle mit Aufträgen, die sind wie folgt aussehen:SQL Summe von Daten zwischen zwei Terminen in einer Spalte

t1

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

Und ich habe zweite Tabelle mit einem Umsatz:

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

Das Ziel ist es, SUM des Umsatzes mehr als das erste Bestelldatum und weniger als das zweite Bestelldatum :

Ergebnis

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

Erste Idee ist es, Bestelldaten Bewertung wie

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

dann etwas tun, wie dies zu machen:

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 

Ich weiß, das ist falsch, aber das ist die Logik in meinem Kopf.

Können Sie mir bitte ein paar Ideen geben, wie das geht?

+1

bitte auch Testdaten angeben – TheGameiswar

Antwort

1

Sieht aus wie Summe zwischen Terminen. Ich nehme an, dass das aktuelle Bestelldatum ohne das nächste Bestelldatum enthalten ist.

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

Funktioniert! Groß ! Vielen Dank –

0

Try this:

;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