SQL Serverの条件付きグループ?

私はこの簡単なクエリを持っています:

SELECT YEAR(P.DateCreated)
      ,MONTH(P.DateCreated)
      ,COUNT(*) AS cnt
FROM   tbl1,
       tbl2....
GROUP BY
         MONTH(P.DateCreated)
        ,YEAR(P.DateCreated)

これは放出する:

enter image description here

今私は同じクエリが必要ですが、groupby のみ年あたり:

そう :

SELECT YEAR(P.DateCreated)

      ,COUNT(*) AS cnt
FROM   tbl1,
       tbl2....
GROUP BY
         YEAR(P.DateCreated)

私はしない 2つの質問をしたい。

ここで group by を行うことができますか?

私は別のに置き換えられるものとすることができますが、 1つを 2つ置き換える

GROUP BY
     CASE WHEN @timeMode='y' THEN YEAR(P.DateCreated)
          WHEN @timeMode='m' THEN MONTH(P.DateCreated), YEAR(P.DateCreated) end

enter image description here

どんな助け?

7

2 答え

2つの別々のクエリを使う方が良いでしょうが、好きなようにすることができます

GROUP BY YEAR(P.DateCreated),
       CASE 
          WHEN @timeMode='m' THEN MONTH(P.DateCreated) end

As WHEN @timeMode <> 'm' the second GROUP BY expression will be NULL for all rows and not affect the result.

15
追加された
@ timeMode = 'y'を指定すると、最後にクエリにが含まれるようになります。
追加された 著者 Royi Namir,
だから私はユニットごとに最小グループから始めなければならない。
追加された 著者 Royi Namir,
group by myColumn、null、null は有効ですか?
追加された 著者 Royi Namir,
(あなたが言ったように)グループでconstを使用することはできませんが、一方でこれは GROUP BY YEAR(P.DateCreated)、CASE WHEN @ timeMode = 'm' THEN MONTH(P.DateCreated)end は動作しますか? @timeMode <> 'm' なので、そこにはどのような値がありますか?それはgroupbyカントはそれの中にnullのconstを持っているので、それはnullではありません...あなたは説明できますか?
追加された 著者 Royi Namir,
ありがとう。 :)ありがとう。 :)ありがとう。 :)
追加された 著者 Royi Namir,
あなたが何を求めているのかは分かりません。 CASE は単一の式だけを返すことができます。これはあなたが実際に尋ねた質問に答えます。
追加された 著者 Martin Smith,
@RoyiNamir - GROUP BY の式の順序は違いはありません。重要なことは、式を GROUP BY したくない場合は、定数値を返すことです。 IIRC SQL Serverでは、そのような GROUP BY の式で実際の定数を使用することはできません。私は今SSMSを開いてテストしていない
追加された 著者 Martin Smith,
@RoyiNamir - NULL です。 SQL Serverでは、 NULL を返す可能性のある式でグループ化することはできませんが、グループ化されたテーブルをまったく参照しない式は禁止されます。 NULL に評価することができるにもかかわらず、 GROUP BY CASE WHEN 1 = 0 THEN myColumn ELSE NULL END は有効です。
追加された 著者 Martin Smith,

以上句を使用すると、1つのクエリで年間および月の両方のカウントを返すことができます。

SELECT  distinct YEAR(P.DateCreated) as Year
,       MONTH(P.DateCreated) as Month
,       COUNT(*) over (partition by YEAR(P.DateCreated), MONTH(P.DateCreated)) 
            as MonthCount
,       COUNT(*) over (partition by YEAR(P.DateCreated)) as YearCount
FROM   YourTable P

SQL Fiddleでのライブ例

5
追加された
私はそれがどのように役立つかを見ていない... :)あなたは精巧にできますか
追加された 著者 Royi Namir,
両方の結果が返されます。 2つのモードの間でクエリを切り替える場合は、@ MartinSmithの答えをご覧ください!
追加された 著者 Andomar,