0

今日、先週、先月、今週のテーブルの各メッセージ タイプに対して、TSQL 結果セットを作成しようとしています。異なるメッセージ タイプは 101、103、202 です。

次の sql は必要な出力を生成しますが、3 つのメッセージ タイプに基づいて結果をフィルター処理する方法がわかりません。

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

ここに画像の説明を入力

*編集 *

ロロの結果を投稿する Lolo からの投稿の結果

4

1 に答える 1

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

MsgTypegroup by を使用するごとに 1 行を取得します。また、カウントの評価方法も変更しました。私のソリューションでは、速度を向上させるサブクエリはありません。また、where 句に日付フィルターを追加することもできます。

于 2013-11-14T12:05:55.907 に答える