首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MSSQL -为过去7天内不存在的条目创建记录

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

Stack Overflow用户
提问于 2012-02-13 18:30:33
回答 3查看 220关注 0票数 1

我有一个ASP.NET网站的C#后端使用2008的内容。

我编写了以下存储过程,它检查过去7天内的任何记录,然后返回它发现的内容。

代码语言:javascript
复制
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条记录。例如:

假设我的表中有以下记录

代码语言:javascript
复制
-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天的响应数量,如果在其中的任何一天没有找到记录,它就会创建一个记录,其中的响应位于正确的位置。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-02-13 18:42:07

这是数字表的一个很好的应用程序(例如:http://www.projectdmx.com/tsql/tblnumbers.aspx)

假设您有一个至少有6个数字的数字表dbo.Nums,您可以尝试以下操作:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2012-02-13 19:31:18

这演示了获取一周中每天的汇总数据,即使有些天没有数据:

代码语言:javascript
复制
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放入正确的日期。

票数 0
EN

Stack Overflow用户

发布于 2012-02-14 03:29:56

用最后七个日期声明一个表变量,并将其包含在查询中:

代码语言:javascript
复制
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

结果:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9265873

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档