2013-11-14 42 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