我有一个包含几列的表格 [ShipAmt]
、[Cdate]
、....
我想按特定月份的周对列求和并显示出来。
被认为是从 1 月开始到月末的那一周。
如果一周内没有ProductOrders
,我想将它们的总和显示为0.00
示例
Week 1 ---> 2016/03/01 - 2016/03/07
Week 2 ---> 2016/03/08 - 2016/03/14
Week 3 ---> 2016/03/15 - 2016/03/21
Week 4 ---> 2016/03/22 - 2016/03/28
Week 5 ---> 2016/03/29 - 2016/03/31
表格
create table ProductOrders
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[ShipAmt] float not null,
[Total] float not null,
[Cdate] datetime not null
)
值(value)观
insert into ProductOrders ([ShipAmt], [Total], [Cdate])
values (26.99 , 40.00, '2016-03-04 20:26:54.000');
insert into ProductOrders ([ShipAmt], [Total], [Cdate])
values (45.00 , 70.88, '2016-03-04 20:28:41.000');
insert into ProductOrders ([ShipAmt], [Total], [Cdate])
values (75.00 ,125.00, '2016-03-05 05:39:03.000');
insert into ProductOrders ([ShipAmt], [Total], [Cdate])
values (49.00 , 71.99, '2016-02-26 11:21:02.000');
现在我想对 3rd
月的所有列求和,我试过了。
Select
Sum([ShipAmt]) [ShipAmt],
Sum([Total]) [Total]
from
(
SELECT
[ShipAmt],
[Total],
[Cdate],
DATEDIFF(week, '2016-03-01', '2016-03-31') AS WeekNumber
FROM ProductOrders
)
as t1
GROUP BY
WeekNumber
输出是
ShipAmt Total
195.99 307.87
期望的输出
ShipAmt Total
146.99 235.88
0.00 0.00
0.00 0.00
0.00 0.00
最佳答案
试试这个
DECLARE @d1 DATETIME, @d2 DATETIME
SELECT @d1 = '2016-03-01' ,@d2= '2016-03-31'
;WITH dates ( [date] )
AS
(
SELECT @d1
UNION all
SELECT dateadd(d,1,date)
FROM dates
where date < @d2
)
select DISTINCT DATEPART(week,[date]) AS WeekNumber
, ISNULL(M.TotalShipAmt,0)
,ISNULL(M.Total,0)
from dates
LEFT OUTER JOIN(
SELECT
SUM([ShipAmt]) AS TotalShipAmt,
SUM([Total])AS Total,
DATEPART(week,[Cdate]) AS WEEKNUMBER
FROM ProductOrders ProductOrders
GROUP BY DATEPART(week,[Cdate])
)AS M ON M.WEEKNUMBER=DATEPART(week,[date])
关于sql - 在 sql server 中按特定月份的周分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35939530/