(修改了一下 - 我打得太很快進入)
我開始在這個戳,並且因爲它擊中了一些相當棘手的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