CASE语句中的条件COUNT

时间:2019-03-19 18:35:07

标签: sql tsql

表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
Table 1

表2
Table 2

2 个答案:

答案 0 :(得分:0)

使用总金额

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)

答案 1 :(得分:0)

您快到了!我做了一些更改:

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之外,并在返回时返回某种情况(任何非null的东西都可以-我使用1,但也可能是'x'等)满足条件。不要输入ELSE-如果没有ELSE并且不满足条件,则CASE WHEN将返回null,并且null不计数(您也可以写ELSE NULL,尽管这是多余的)
  • 始终对所有列名称进行限定-当将来添加更多表时,或者即使将具有相同名称的新列添加到现有表中,这也可以使查询正常运行
  • 您在第二次WHEN中忘记了一个THEN
  • 您不一定需要对DATEFROMPARTS的输出进行GROUP BY。当使用确定性函数(始终从相同的输入产生相同的输出)时,db足够聪明,可以知道输入的分组也很好
  • 您的示例数据没有包含任何使COUNT计数为1+的数据,但是我敢肯定您还会计算出其他条件计数(这使测试变得更加困难)