我有一个ASP.NET网站的C#后端使用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(today)和2012-02-09都没有记录。
我如何创建一个SQL语句来检查最后7天的响应数量,如果在其中的任何一天没有找到记录,它就会创建一个记录,其中的响应位于正确的位置。
发布于 2012-02-13 18:42:07
这是数字表的一个很好的应用程序(例如:http://www.projectdmx.com/tsql/tblnumbers.aspx)
假设您有一个至少有6个数字的数字表dbo.Nums,您可以尝试以下操作:
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发布于 2012-02-13 19:31:18
这演示了获取一周中每天的汇总数据,即使有些天没有数据:
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值表示的最接近午夜的时间是午夜前的3ms。您可以使用StartOfDay和EndOfDay值将任何DateAdded放入正确的日期。
发布于 2012-02-14 03:29:56
用最后七个日期声明一个表变量,并将其包含在查询中:
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 3https://stackoverflow.com/questions/9265873
复制相似问题