SQL组按日,每天显示订单

前端之家收集整理的这篇文章主要介绍了SQL组按日,每天显示订单前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个sql 2005表,让我们称之为Orders,格式如下:
OrderID,OrderDate,OrderAmount
1,25/11/2008,10
2,2
3,30/1002008,5

然后我需要生成一份报表,显示过去7天每天的订单量:

Day,OrderCount,OrderAmount
25/11/2008,2,12
26/11/2008,0 
27/11/2008,0 
28/11/2008,0
29/11/2008,0
30/11/2008,1,5

通常会产生以下SQL查询

select count(*),sum(OrderAmount)
    from Orders
    where OrderDate>getdate()-7
    group by datepart(day,OrderDate)

有一个问题,它会跳过没有订单的日子:

Day,12
30/11/2008,5

通常情况下,我会使用tally表和外部连接来解决这个问题,但是我真的在寻找一个更简单或更有效的解决方案.对于报告查询来说,似乎已经有一些优雅的解决方案应该可用.

所以:1.这个结果可以从一个简单的查询获得,而不使用统计表?

和2.如果否,我们可以即时创建这个tally表(可靠的)(我可以使用CTE创建一个统计表,但递归堆栈将我限制为100行)?

解决方法

sql不是“跳过”日期…因为查询运行在实际上在表中的数据.所以,如果你在1月14日的表中没有DATE,那为什么sql显示一个结果:)

你需要做的是制作一个临时表,并加入它.

CREATE TABLE #MyDates ( TargetDate DATETIME )
INSERT INTO #MyDates VALUES CONVERT(DATETIME,CONVERT(VARCHAR,GETDATE() - 0,101))
INSERT INTO #MyDates VALUES CONVERT(DATETIME,GETDATE() - 1,GETDATE() - 2,GETDATE() - 3,GETDATE() - 4,GETDATE() - 5,GETDATE() - 6,GETDATE() - 7,101))

SELECT CONVERT(VARCHAR,TargetDate,101) AS Date,COUNT(*) AS OrderCount
FROM dbo.Orders INNER JOIN #MyDates ON Orders.Date = #MyDates.TargetDate
GROUP BY blah blah blah (you know the rest)

你去!

猜你在找的MsSQL相关文章