在sql server中的条件组?

Roy*_*mir 7 t-sql sql-server sql-server-2005

我有这个简单的查询:

SELECT YEAR(P.DateCreated)
      ,MONTH(P.DateCreated)
      ,COUNT(*) AS cnt
FROM   tbl1,
       tbl2....
GROUP BY
         MONTH(P.DateCreated)
        ,YEAR(P.DateCreated)
Run Code Online (Sandbox Code Playgroud)

这会发出:

在此输入图像描述

现在我需要相同的查询,但每年使用groupby :

所以:

SELECT YEAR(P.DateCreated)

      ,COUNT(*) AS cnt
FROM   tbl1,
       tbl2....
GROUP BY
         YEAR(P.DateCreated)
Run Code Online (Sandbox Code Playgroud)

希望做2个查询.

有什么方法可以在group by这里做到吗?

我可以做一个被另一个所取代,但我不能一个由两个替代 ...

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

在此输入图像描述

任何帮助?

Mar*_*ith 17

使用两个单独的查询会更好,但可以这样做

GROUP BY YEAR(P.DateCreated),
       CASE 
          WHEN @timeMode='m' THEN MONTH(P.DateCreated) end
Run Code Online (Sandbox Code Playgroud)

因为WHEN @timeMode <> 'm'第二个GROUP BY表达式将NULL适用于所有行而不会影响结果.


And*_*mar 7

您可以使用一个over子句在一个查询中返回每年和每月的计数:

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
Run Code Online (Sandbox Code Playgroud)

SQL Fiddle的实例.