Rad*_*094 14 sql aggregate sql-server-2005
我有一个SQL 2005表,我们称之为Orders,格式如下:
OrderID, OrderDate, OrderAmount
1, 25/11/2008, 10
2, 25/11/2008, 2
3, 30/1002008, 5
Run Code Online (Sandbox Code Playgroud)
然后我需要生成一个报告表,显示过去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
Run Code Online (Sandbox Code Playgroud)
通常会产生这种情况的SQL查询:
select count(*), sum(OrderAmount)
from Orders
where OrderDate>getdate()-7
group by datepart(day,OrderDate)
Run Code Online (Sandbox Code Playgroud)
有一个问题是它会跳过没有订单的日子:
Day, OrderCount, OrderAmount
25/11/2008, 2, 12
30/11/2008, 1, 5
Run Code Online (Sandbox Code Playgroud)
通常情况下,我会使用计数表和外部联接来修复此行,但我真的在寻找更简单或更有效的解决方案.对于报表查询来说,似乎有一个常见的要求,即已经有一些优雅的解决方案可用.
所以:1.这个结果可以从一个简单的查询中获得而不使用计数表吗?
2.如果不是,我们可以动态创建这个计数表(可靠)(我可以使用CTE创建计数表,但递归堆栈将我限制为100行)?
Tim*_*uri 10
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)
Run Code Online (Sandbox Code Playgroud)
你去!
根据 SQL Server 处理临时表的方式,您可以或多或少地轻松安排创建临时表并用您感兴趣的 7 个(或者是 8 个?)日期填充它。然后您可以将其用作统计表。据我所知,没有更干净的方法;您只能选择表中存在的数据或可以从表或表组中存在的数据派生的数据。如果订单表中未显示某些日期,则您无法从订单表中选择这些日期。