我有一个sql 2005表,让我们称之为Orders,格式如下:
OrderID,OrderDate,OrderAmount 1,25/11/2008,10 2,2 3,30/1002008,5
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)
你去!