【问题标题】:SQL sum data between 2 dates in one column一列中2个日期之间的SQL求和数据
【发布时间】:2016-06-24 07:57:40
【问题描述】:

我有一张订单表格,如下所示:

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

我知道这是错误的,但这是我脑海中的逻辑。

你能给我一些想法吗?

【问题讨论】:

  • 请同时提供测试数据

标签: sql sql-server date sum


【解决方案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   

【讨论】:

  • 有效!伟大的 !谢谢
【解决方案2】:

试试这个:

;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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多