我有一个SQL 2005表,我们称之为Orders,格式如下:
OrderID, OrderDate, OrderAmount 1, 25/11/2008, 10 2, 25/11/2008, 2 3, 30/1002008, 5
然后我需要生成一个报告表,显示过去7天内每天的订购金额:
Day, OrderCount, OrderAmount 25/11/2008, 2, 12 26/11/2008, 0, 0 27/11/2008, 0, 0 28/11/2008, 0, 0 29/11/2008, 0, 0 30/11/2008, 1, 5
通常会产生这种情况的SQL查询:
select count(*), sum(OrderAmount) from Orders where OrderDate>getdate()-7 group by datepart(day,OrderDate)
有一个问题是它会跳过没有订单的日子:
Day, OrderCount, OrderAmount 25/11/2008, 2, 12 30/11/2008, 1, 5
通常情况下,我会使用计数表和外部联接来修复此行,但我真的在寻找更简单或更有效的解决方案.对于报表查询来说,似乎有一个常见的要求,即已经有一些优雅的解决方案可用.
所以:1.这个结果可以从一个简单的查询中获得而不使用计数表吗?
2.如果不是,我们可以动态创建这个计数表(可靠)(我可以使用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, CONVERT(VARCHAR, GETDATE() - 1, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 2, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 3, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 4, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 5, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, GETDATE() - 6, 101)) INSERT INTO #MyDates VALUES CONVERT(DATETIME, CONVERT(VARCHAR, 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)
你去!