我有一个带有C#后端的ASP.NET网站,使用MSSQL SQL Server 2008作为其内容。
我编写了以下存储过程,该过程检查过去7天内的所有记录,然后返回它找到的内容。
ALTER PROCEDURE [dbuser].[GetResponses]
(
@QUEST_ID int
)
AS
SELECT DateAdded, SUM(Responses) AS responseCount
FROM ActiveResponses
WHERE @QUEST_ID = QuestionnaireID AND DateAdded >= dateadd(day,datediff(day,0,GetDate())- 6,0)
GROUP BY DateAdded
RETURN
我的问题是,如果过去7天内没有任何记录存在,那么我在网站后端的方法将失败,因为它需要7条记录。例如:
假设我的表格中有以下记录
-DateAdded--------Responses
2012-02-12 4
2012-02-11 5
2012-02-10 8
2012-02-08 7
2012-02-07 3
请注意, 2012-02-13 (今天)和 2012-02-09
都没有记录如何创建一个SQL语句,检查过去7天的响应数量,如果在任何一天内找到没有记录,则会创建响应为 0 在正确的位置?
答案 0 :(得分:2)
这是数字表的一个很好的应用(例如:http://www.projectdmx.com/tsql/tblnumbers.aspx)
假设您有一个数字表dbo.Nums
,其中至少包含6个数字,您可以尝试以下方法:
CREATE TABLE #Dates
(
[Date] DATETIME
)
INSERT INTO #Dates
(
[Date]
)
SELECT
DATEADD(DD, DATEDIFF(DD, 0, GETDATE()) - ([n] - 1), 0)
FROM
[dbo].[Nums] WITH (NOLOCK)
WHERE
[n] < 7
SELECT
[Date],
ISNULL(SUM([Responses]), 0) AS [responseCount]
FROM
#Dates AS d
LEFT OUTER JOIN
ActiveResponses AS a
ON
a.[DateAdded] = d.[Date]
WHERE
@QUEST_ID = QuestionnaireID
ORDER BY
[Date] ASC
答案 1 :(得分:0)
这表明获取一周内每天的摘要数据,即使有些日子没有数据:
declare @Data as table ( DateAdded date, Responses int )
insert into @Data ( DateAdded, Responses ) values ( '2/10/2012', 5 ), ( '2/13/2012', 9 )
; with James as (
select cast( SysDateTime() as date ) as StartOfDay, 7 as DaysLeft
union all
select DateAdd( d, -1, StartOfDay ), DaysLeft - 1
from James
where DaysLeft > 1
)
select J.StartOfDay, DateAdd( ms, -3, cast( DateAdd( day, 1, J.StartOfDay ) as DateTime ) ) as EndOfDay, Coalesce( D.Responses, 0 ) as Responses
from James as J left outer join
@Data as D on D.DateAdded = J.StartOfDay
order by J.StartOfDay desc
左,因为练习将其与您的问卷数据相匹配。
请注意,DateTime值表示的最接近午夜的时间是午夜前3毫秒。您可以使用StartOfDay和EndOfDay值将任何DateAdded删除到正确的日期。
答案 2 :(得分:0)
声明一个包含最后七个日期的表变量,并将其包含在您的查询中:
ALTER PROCEDURE [dbuser].[GetResponses]
(
@QUEST_ID int
)
AS
DECLARE @i INT=0;
DECLARE @today DATE=getdate();
DECLARE @last7 TABLE(DateAdded DATE);
WHILE @i>-7 BEGIN
INSERT INTO @last7 VALUES (DATEADD(DAY,@i,@today));
SET @i -= 1;
END
;WITH a AS (
SELECT ar.DateAdded, count(ar.Responses) as responseCount
FROM ActiveResponses ar
INNER JOIN @last7 z ON z.DateAdded=ar.DateAdded
WHERE @QUEST_ID = ar.QuestionnaireID
GROUP BY ar.DateAdded
)
SELECT DateAdded=ISNULL(a.DateAdded,z.DateAdded)
, responseCount=ISNULL(a.responseCount,0)
FROM @last7 z
LEFT JOIN a ON a.DateAdded=z.DateAdded;
RETURN;
GO
结果:
DateAdded responseCount
---------- -------------
2012-02-13 0
2012-02-12 4
2012-02-11 5
2012-02-10 8
2012-02-09 0
2012-02-08 7
2012-02-07 3