【问题标题】:Multiple counts in one SQL query with grouping一个带有分组的 SQL 查询中的多个计数
【发布时间】:2013-06-16 06:29:57
【问题描述】:

我想运行一个查询来获取按年和月分组的打开事件和已关闭事件的计数,下面的查询在没有分组的情况下可以正常工作,但是一旦我添加了组,它就不起作用了!

SELECT (SELECT COUNT(*) AS Opened FROM Incidents) AS Total 
       (SELECT COUNT(*) AS Solved FROM Incidents WHERE (MONTH(Closedate)=MONTH(Opendate))) AS Solved
GROUP BY YEAR(Incidents.Opendate)

【问题讨论】:

    标签: sql count group-by


    【解决方案1】:

    您可以使用带有 CASE 表达式的单个 SELECT 语句

    SELECT YEAR(Incidents.Opendate) AS [Year], 
           MONTH(Incidents.Opendate) AS [Month], 
           COUNT(*) AS Total,
           SUM(CASE WHEN MONTH(Closedate) = MONTH(Opendate) THEN 1 ELSE 0 END) AS Solved
    FROM Incidents
    GROUP BY YEAR(Incidents.Opendate), MONTH(Incidents.Opendate)
    

    【讨论】:

      【解决方案2】:

      试试:

      SELECT 
              (SELECT COUNT(*) FROM Incidents) as Total ,
              (SELECT COUNT(*)  FROM Incidents WHERE (Month(Closedate)=MONTH(Opendate))) as Solved
          FROM Incidents
          Group by YEAR(Incidents.Opendate)
      

      【讨论】:

      • Shree,上面的查询无效。我收到此错误(消息 156,级别 15,状态 1,第 3 行关键字“as”附近的语法不正确。)
      【解决方案3】:

      我已经解决了,下面是查询

      select  COUNT(CASE WHEN Month(Closedate)=Month(Opendate) then 1 else null end) AS closed,COUNT(*) AS Opened
      from incidents
      Group by Year(Opendate), Month(Opendate)
      Order by Year(Opendate), Month(Opendate)
      

      【讨论】:

      • 您可以省略else null 位。我认为大多数 SQL 产品都允许这样做,将缺少的ELSE 子句默认为ELSE NULL。但是,这与@Alexander Fedorenko 的回答本质上不一样吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 2016-06-11
      • 1970-01-01
      • 2021-07-17
      • 2010-11-19
      • 1970-01-01
      相关资源
      最近更新 更多