(修改了一下 - 我打得太很快进入)
我开始在这个戳,并且因为它击中了一些相当棘手的SQL概念也迅速成长为以下怪物。如果可行,你可能会更适应THEn的解决方案;或者像其他许多人一样建议,使用应用程序代码填补空白可能是可取的。
-- A temp table holding the 30 dates that you want to check
DECLARE @Foo Table (Date smalldatetime not null)
-- Populate the table using a common "tally table" methodology (I got this from SQL Server magazine long ago)
;WITH
L0 AS (SELECT 1 AS C UNION ALL SELECT 1), --2 rows
L1 AS (SELECT 1 AS C FROM L0 AS A, L0 AS B),--4 rows
L2 AS (SELECT 1 AS C FROM L1 AS A, L1 AS B),--16 rows
L3 AS (SELECT 1 AS C FROM L2 AS A, L2 AS B),--256 rows
Tally AS (SELECT ROW_NUMBER() OVER(ORDER BY C) AS Number FROM L3)
INSERT @Foo (Date)
select dateadd(dd, datediff(dd, 0, dateadd(dd, -number + 1, getdate())), 0)
from Tally
where Number < 31
第1步是建立一个临时表包含您关心的30个日期。这种抽象的奇怪是关于建立一个连续整数表的最快方式;添加几个子查询,并且可以在几秒钟内填充数百万或更多。我拿第30个,并使用dateadd和当前日期/时间将它们转换为日期。如果你已经有一个1-30的“固定”表,你可以使用它并完全跳过CTE(用你的表替换表“Tally”)。
外部两个日期函数调用删除生成的字符串的时间部分。
(请注意,我假设你的订单日期也没有时间部分 - 否则,你就必须解决另一个常见的问题。)
出于测试目的,我建表#Orders,这可以让你的休息:
SELECT f.Date, sum(ordersubtotal) as SalesSum
from @Foo f
left outer join #Orders o
on o.DateCreated = f.Date
group by f.Date
你在使用?如果你使用MySQL或SQL Server,还是其他什么东西?答案可能会有所不同 – AnonJr 2009-08-13 20:40:39
我使用MS SQL Server的 – MartinHN 2009-08-13 20:42:33