按品牌获得总和(销售)组但不同日期的语法

时间:2015-11-30 18:13:49

标签: sql sql-server database aggregate-functions

我的数据是这样的

item        date        country    sales
----------------------------------------
motorola    2015-01-01     US        10
motorola    2015-01-01     UK        20
motorola    2015-01-02     US        40
motorola    2015-01-02     UK        80
motorola    2015-01-03     US       120
motorola    2015-01-03     UK       150
motorola    2015-01-04     US       170
motorola    2015-01-04     US       180

我想从2015年1月2日到2015年1月4日获得摩托罗拉的每日销售增量。

所以例如

  • 2015年1月1日的总销售额为10(美国)+20(英国)= 30
  • 2015年1月2日的总销售额为120,因此每日销售增量(日期销售额减去D-1)为90
  • 2015年1月3日的总销售额为270,因此每日增量为150
  • 2015年1月4日的总销售额为350,因此每日增量为80

我期待结果元组:

date         dailyDelta
2015-01-02      90
2015-01-03     150
2015-01-04      80

获取此功能的语法是什么?我使用的是SQL Server 2012。

由于

5 个答案:

答案 0 :(得分:0)

我并没有真正看到自我加入的方式。以下是它的工作原理:

select a.date
  , a.item
  , sum(a.sales) - sum(b.sales) as DailyDelta
from table a
  join table b on a.product = b.product
    and b.date = dateadd(day, -1, a.date)
group by a.date
  , a.item

表现不佳,但它会完成工作。

答案 1 :(得分:0)

就是这样,查询逻辑就像它获得的一样简单,性能优于内连接:

select date, sum(sales) - coalesce(lag(sum(sales), 1) over (order by date), 0)
from my_sales
group by date
order by date

使用窗口函数lag。玩它:http://sqlfiddle.com/#!6/bebab/8并阅读它:https://msdn.microsoft.com/en-us/library/hh231256.aspx

简要地说,lag(sum(sales), 1) over (order by date)表示"获取此查询的上一条记录的总和(销售额)列,按日期排序",coalesce(XXX, 0)表示"当XXX为空时,让我们假装它是一个零"

答案 2 :(得分:0)

以下查询基于MySQL,但您可以调整它以使其适用于SQL Server。我希望SQL Server也支持相同的

select o.date, t.tsales - sum(sales) delta  from test o, (select date, sum(sales) tsales from test group by date) t
where o.date = t.date -1 group by o.date

对于上述查询,我​​得到以下结果

“日期”“delta” “2015-01-01”“90” “2015-01-02”“150” “2015-01-03”“80”

答案 3 :(得分:0)

使用自我加入

declare @t table (item varchar(10), [date] date,country  char(2),  sales int)
insert into @t (item, [date],country,  sales) values
('motorola','2015-01-01','US',10),
('motorola','2015-01-01','UK',20),
('motorola','2015-01-02','US',40),
('motorola','2015-01-02','UK',80),
('motorola','2015-01-03','US',120),
('motorola','2015-01-03','UK',150),
('motorola','2015-01-04','US',170),
('motorola','2015-01-04','US',180)
;with a as (select row_number() over (order by [date]) r,[date],sum(sales) n from @t group by [date]) 

select a.[date],a.n-isnull(a1.n,0) dailyDelta from a  join a a1 on a.r =a1.r+1

答案 4 :(得分:-1)

试试这个..

选择日期,

  ( sum(sales) - LAG(sum(sales),1,0) over (order by sales) ) as dailyDelta

FROM Table

按日期分组

按日期排序;