2013-11-14 43 views
0

好的,所以我正在尝试为我的表中的每个消息类型创建一个TSQL结果集,用于今日,上周,上个月和本周。不同的消息类型是101,103,202。今天,上周,上个月,本周的多个选择

下面的sql产生我需要的输出,但我无法弄清楚如何过滤基于三种消息类型的结果。

Select distinct 
    (Select Count(*) from MsgDateDetail 
     Where convert(date,MsgDate,103) = Convert(date,GETDATE()) 
And SenderBIC = @senderbic) As Today, 
    (Select Count(*) from MsgDateDetail 
     Where MsgDate Between DATEADD(dd, -(DATEPART(dw, GetDate())-1)-7, GetDate()) 
     And DATEADD(dd, 7-(DATEPART(dw, GetDate()))-7, GetDate()) 
     And SenderBIC = @senderbic) As LastWeek, 
    (Select Count(*) FROM MsgDateDetail 
     Where convert(date,MsgDate,103) = (DATEADD(mm,-1, Convert(date,GETDATE()))) 
And SenderBIC = @senderbic) AS LastMonth, 
    (Select Count(*) from MsgDateDetail 
     Where MsgDate between (DATEADD(week, DATEDIFF(week,0,GETDATE()),-1)) AND getDate() 
     And SenderBIC = @senderbic) AS ThisWeek 
FROM MsgDateDetail h1 

enter image description here

*编辑*

后从洛洛 结果Results of post from Lolo

+0

你能澄清一下re:消息类型吗?它是什么领域 - SenderBIC?每个包含该类型计数的消息类型是否需要1行? – AdaTheDev

+0

对不起。该字段是MsgType。所以上面的表结果包含了所有的消息类型,我需要在每个消息中输入一行 – CSharpNewBee

回答

1

试试这个:

SELECT 
    MsgType, 

    SUM(CASE WHEN CONVERT(DATE, MsgDate, 103) = 
        CONVERT(DATE, GETDATE()) 
      THEN 1 ELSE 0 END) As Today, 

    SUM(CASE WHEN CONVERT(DATE, MsgDate, 103) BETWEEN 
        DATEADD(DD, -(DATEPART(DW, GETDATE())-1)-7, GETDATE()) AND DATEADD(DD, 7-(DATEPART(DW, GETDATE()))-7, GETDATE()) 
      THEN 1 ELSE 0 END) As LastWeek, 

    SUM(CASE WHEN DATEADD(DD, -DATEPART(DD, CONVERT(DATE, MsgDate, 103)) + 1, CONVERT(DATE, MsgDate, 103)) = 
        DATEADD(MM, -1, DATEADD(DD, -DATEPART(DD, GETDATE()) + 1, CONVERT(DATE, GETDATE()))) 
      THEN 1 ELSE 0 END) As LastMonth, 

    SUM(CASE WHEN CONVERT(DATE, MsgDate, 103) BETWEEN 
        DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),-1) AND GETDATE() 
      THEN 1 ELSE 0 END) As ThisWeek 
FROM 
    MsgDateDetail 
WHERE 
    SenderBIC = @senderbic 

GROUP BY 
    MsgType 

每获取一行使用分组。我也修改了count的计算方法 - 在我的解决方案中没有子查询可以让你加快速度。你也可以在where子句中添加日期过滤器。

+0

第一个THEN的语法错误 - 请参阅上面的screem。 – CSharpNewBee

+0

@CSharpNewBee我纠正了语法错误,但LastMonth计数仍然存在一些问题 – Krzysztof

+0

@CSharpNewBee我也修复了LastMonth计数。 – Krzysztof