MSSQL - 为过去7天内不存在的条目创建记录

时间:2012-02-13 18:30:33

标签: sql-server sql-server-2008 stored-procedures

我有一个带有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 在正确的位置?

3 个答案:

答案 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