强制sql结果返回每个日期,即使它不在数据库中
可能重复:强制sql结果返回每个日期,即使它不在数据库中,sql,sql-server-2005,Sql,Sql Server 2005,可能重复: 我的问题是: SELECT SUM(number) AS number, c_date FROM my_table WHERE c_date between '11/6/2012' AND '11/12/2012' GROUP BY c_date ORDER BY c_date DESC 它将返回类似这样的结果 11 '11/12/2012' 9 '11/9/2012' 10 '11/8/2012' 10 '11/
我的问题是:
SELECT SUM(number) AS number, c_date
FROM my_table
WHERE c_date between '11/6/2012' AND '11/12/2012'
GROUP BY c_date
ORDER BY c_date DESC
它将返回类似这样的结果
11 '11/12/2012'
9 '11/9/2012'
10 '11/8/2012'
10 '11/7/2012'
10 '11/6/2012'
现在,我如何强制返回结果包括11/11和11/10,数字为0,而不是完全跳过它们。此外,我无法创建日期表来存储日期。因为您无法创建新表 接下来,从新创建的“日历”表执行
左联接到我的表
:
SELECT ISNULL(SUM(mt.number), 0) AS number, mc.c_date
FROM
my_calendar mc LEFT JOIN
my_table mt ON mt.c_date = mc.c_date
WHERE mc.c_date between '11/6/2012' AND '11/12/2012'
GROUP BY mc.c_date
ORDER BY mc.c_date DESC
您可以创建一个返回日期范围的用户定义函数。它看起来是这样的:
CREATE FUNCTION uspDateRange(@MinDate datetime, @Maxdate datetime)
RETURNS @DateRange TABLE ([Date] datetime)
AS
BEGIN
DECLARE @Date datetime
SET @Date = @MinDate
WHILE (@Date < @MaxDate)
BEGIN
INSERT INTO @DateRange VALUES(@Date)
SET @Date = DATEADD(day, 1, @Date)
END
RETURN
END
GO
SELECT SUM(number) AS number, c_date
FROM my_table t
INNER JOIN uspDateRange('11/6/2012', '11/12/2012') r ON t.c_date = r.[Date]
GROUP BY c_date
ORDER BY c_date DESC
您的查询如下所示:
CREATE FUNCTION uspDateRange(@MinDate datetime, @Maxdate datetime)
RETURNS @DateRange TABLE ([Date] datetime)
AS
BEGIN
DECLARE @Date datetime
SET @Date = @MinDate
WHILE (@Date < @MaxDate)
BEGIN
INSERT INTO @DateRange VALUES(@Date)
SET @Date = DATEADD(day, 1, @Date)
END
RETURN
END
GO
SELECT SUM(number) AS number, c_date
FROM my_table t
INNER JOIN uspDateRange('11/6/2012', '11/12/2012') r ON t.c_date = r.[Date]
GROUP BY c_date
ORDER BY c_date DESC
“我也不能创建一个日期表来存储日期。”为什么不呢?@MichaelFredrickson只能查询当前数据库您可以随时使用CTE或temp表创建一个数字表。@kricket请查看我的更新答案。。。同样的想法,但链接指向使用CTE的示例。