【问题标题】:Conditional COUNT within CASE statementCASE 语句中的条件 COUNT
【发布时间】:2019-03-19 18:35:07
【问题描述】:

表 1 列出了客户、他们的会员资格、他们使用的服务以及使用服务的日期

表 2,只是按月份和会员类型分组的表 1,然后是服务会话数

我要做的是仅按特定服务类型计算会员会话。这是我到目前为止所拥有的,它返回一个错误,说“Service_Type”不在聚合函数或 group by 子句中,当我将“Service_Type”放在 group by 中时,查询没有错误,但 SESSIONS 列全部为 NULL .

SELECT 
  DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1)AS 'Draft_Date', 
  Membership,
  CASE 
    WHEN Membership = 5 AND Service_Type = 'A' THEN COUNT(*)
    WHEN Membership = 2 AND Service_Type IN ('J','C')
  END AS'SESSIONS' 
FROM Table1 t1 
GROUP BY DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1),Membership

case 语句将包括所有成员资格和服务类型,但我认为这对于我的示例来说已经足够了。任何帮助将不胜感激!这几天我一直在做这件事。

表1

表2

【问题讨论】:

    标签: sql tsql


    【解决方案1】:

    你就快到了!我做了一些更改:

    SELECT 
      DATEFROMPARTS(YEAR(t1.Date), MONTH(t1.Date),1) AS Draft_Date, 
      Membership,
      COUNT(CASE WHEN t1.Membership = 5 AND t1.Service_Type = 'A' THEN 1 END) as m5stA,
      COUNT(CASE WHEN t1.Membership = 2 AND t1.Service_Type IN ('J','C') THEN 1 END) as m2stJC
    FROM Table1 t1 
    GROUP BY YEAR(t1.Date), MONTH(t1.Date), Membership
    

    变化:

    • 避免使用撇号作为列名的别名,如果必须使用 ascii 标准“双引号”
    • 在进行条件计数时,将计数放在 CASE WHEN 之外,并在返回某些内容时设置大小写(任何非空值都可以 - 我使用 1,但它也可能是 'x' 等)条件满足。不要放置 ELSE - 如果没有 ELSE 且条件不满足,CASE WHEN 将返回 null,并且 null 不计数(您也可以写 ELSE NULL,尽管它是多余的)
    • 始终限定所有列名 - 这有助于在将来添加更多表时保持查询正常工作,或者即使将具有相同名称的新列添加到现有表中
    • 您在第二个 WHEN 中忘记了 THEN
    • 您不一定需要对 DATEFROMPARTS 的输出进行 GROUP BY。当使用确定性函数(总是从相同的输入产生相同的输出)时,数据库足够聪明,知道对输入进行分组也很好
    • 顺便说一下,您的示例数据不包含任何会使 COUNT 计数为 1+ 的数据,但我相信您会有其他条件计数可以解决(这只是让测试变得更加困难)

    【讨论】:

    • 感谢您提供的解决方案和其他说明,效果很好!
    【解决方案2】:

    使用总和

    SELECT DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1) AS Draft_Date , Membership,
    sum(CASE WHEN Membership = 5 AND Service_Type = 'A' THEN 1  else 0 end),
    sum(case WHEN Membership = 2 AND Service_Type IN ('J','C') then 1 else 0 end)
    
    FROM Table1 t1 group by DATEFROMPARTS(YEAR(t1.Date),MONTH(t1.Date),1)
    

    【讨论】:

      猜你喜欢
      • 2021-05-01
      • 1970-01-01
      • 2020-02-08
      • 1970-01-01
      • 2011-06-30
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多