【问题标题】:SQL - Trying to count records based on CASE WHEN (SIMPLE?)SQL - 尝试根据 CASE WHEN 计算记录(简单?)
【发布时间】:2020-07-21 23:36:22
【问题描述】:

非常简单的情况 - 我无法正确计算下表的月数 - 预期数字是 2,而不是 3 - 有趣的是,“valueagg”在相同条件下正确计算!

INSERT INTO ForgeRock
    ([productName], [description], [month], [value] )
VALUES
    ('OpenIDM', 'Y',1,33.2),
    ('OpenIDM', 'Y',2, 12.1),
    ('OpenIDM', 'Y',3, 1.1)
;

测试

SELECT
  productName,
  description,
    sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg    --works
 ,count(CASE WHEN [MONTH] between 1 and 2 then [MONTH] else 0 end) month_count --doesn't work
 ,count(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count2      --doesn't work
FROM
  ForgeRock
  group by   productName,
  description

结果

| productName | description |           valueagg | month_count | month_count2 |
|-------------|-------------|--------------------|-------------|--------------|
|     OpenIDM |           Y | 45.300000000000004 |           3 |            3 |

http://sqlfiddle.com/#!18/14603/3/0

【问题讨论】:

    标签: sql count case


    【解决方案1】:

    删除 CASE 表达式的 ELSE 部分:

    SELECT
      productName,
      description,
        sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg
        ,count(CASE WHEN [MONTH] between 1 and 2 then [MONTH] end) month_count
    FROM
      ForgeRock
      group by   productName,
      description
    

    或者像这样替换为SUM()

    SELECT
      productName,
      description,
        sum(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) valueagg
        ,sum(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count
    FROM
      ForgeRock
      group by   productName,
      description
    

    【讨论】:

      【解决方案2】:

      您正在使用 count()elsecount() 计算非 NULL 值的数量,并且 -- 0 与任何其他值一样“非 NULL”。

      改用sum()

      SELECT productName, description,
             SUM(CASE WHEN [MONTH] between 1 and 2 then [VALUE] else 0 end) as valueagg    --works
             SUM(CASE WHEN [MONTH] between 1 and 2 then [MONTH] else 0 end) as month_count --doesn't work
             SUM(CASE WHEN [MONTH] between 1 and 2 then 1 else 0 end) month_count2      --doesn't work
      FROM ForgeRock
      GROUP BY productName, description
      

      或从COUNT() 中删除ELSE

      【讨论】:

      • 谢谢,刚刚在 15 秒前的最后一列中使用了 sum :) 感谢 COUNT() 逻辑解释,我不知道(或不记得)...
      猜你喜欢
      • 2020-08-23
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多