10

我有这个简单的查询:

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

这将发出:

在此处输入图像描述

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

所以 :

SELECT YEAR(P.DateCreated)

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

不想做 2 个查询。

有什么办法我可以在这里做conitionalgroup by吗?

我可以将一个替换为另一个,但我不能一个替换为两个...

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

在此处输入图像描述

有什么帮助吗?

4

2 回答 2

23

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

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

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

于 2012-06-24T12:12:52.700 回答
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

SQL Fiddle 上的实时示例。

于 2012-06-24T12:10:02.547 回答