【问题标题】:Querying Counts on Field Values in a Single Table查询单个表中字段值的计数
【发布时间】:2012-04-12 04:23:27
【问题描述】:

我有一个包含多个字段的产品表,其中包含用户对各种属性的评价:

product  | attr_1_eval   | attr_2_eval   | attr_3_eval
ABC      | Correct       | Incorrect     | Null
DEF      | Incorrect     | Null          | Null
XYZ      | Undetermined  | Null          | Incorrect
123      | Null          | Undetermined  | Correct
456      | Incorrect     | Correct       | Correct

我需要编写一个查询来汇总所有产品的属性评估(不为空):

evaluation  | correct   | incorrect   | undetermined
attr_1      | 1         | 2           | 1
attr_2      | 1         | 1           | 1
attr_3      | 2         | 1           | 0

这条 SQL 让我走到了这一步:

SELECT 
SUM(CASE WHEN attr_1_eval = 'Correct' then 1 else 0 END) AS correct,
SUM(CASE WHEN attr_1_eval = 'Incorrect' then 1 else 0 END) AS incorrect,
SUM(CASE WHEN attr_1_eval = 'Undetermined' then 1 else 0 END) AS undetermined,
SUM(CASE WHEN attr_2_eval = 'Correct' then 1 else 0 END) AS correct,
...
FROM product

但它不会将 attr_1, attr_2.. 按列中包含错误计数的行分组(如上面所需的结果集)。我正在使用 Postgres,但欢迎任何形式的 SQL 提供帮助。

【问题讨论】:

    标签: sql postgresql group-by sum case


    【解决方案1】:

    你能做3个工会吗?

    SELECT 
      'attr_1' AS evaluation,
      SUM(CASE WHEN attr_1_eval = 'Correct' then 1 else 0 END) AS correct,
      SUM(CASE WHEN attr_1_eval = 'Incorrect' then 1 else 0 END) AS incorrect,
      SUM(CASE WHEN attr_1_eval = 'Undetermined' then 1 else 0 END) AS undetermined
    FROM product
    UNION
    SELECT 
      'attr_2' AS evaluation,
      SUM(CASE WHEN attr_2_eval = 'Correct' then 1 else 0 END) AS correct,
      SUM(CASE WHEN attr_2_eval = 'Incorrect' then 1 else 0 END) AS incorrect,
      SUM(CASE WHEN attr_2_eval = 'Undetermined' then 1 else 0 END) AS undetermined
    FROM product
    UNION
    SELECT 
      'attr_3' AS evaluation,
      SUM(CASE WHEN attr_3_eval = 'Correct' then 1 else 0 END) AS correct,
      SUM(CASE WHEN attr_3_eval = 'Incorrect' then 1 else 0 END) AS incorrect,
      SUM(CASE WHEN attr_3_eval = 'Undetermined' then 1 else 0 END) AS undetermined
    FROM product
    

    这可能不是最优雅/最有效的解决方案,但它应该得到你想要的

    【讨论】:

    • 我正要发布那个。我要做的唯一更改是将UNION 替换为UNION ALL,因为静态'attr_1','attr_2','attr_3' 确保记录不同
    • 在 Postgres 中完美运行,包括 @Lamak 的 UNION All。谢谢!
    【解决方案2】:

    这有点蛮力,我讨厌它扫描表 3 次这一事实,但这似乎确实获得了所需的输出。很抱歉我不知道 PostGres,但这应该可以在 Oracle 中使用:

    select
      Attribute_name,
      Sum (correct) as Correct,
      sum (incorrect) as Incorrect,
      sum (undetermined) as Undetermined
    from
      (
      select
        'attr_1' as Attribute_Name,
        decode (attr_1_eval, 'Correct', 1, 0) as correct,
        decode (attr_1_eval, 'Incorrect', 1, 0) as incorrect,
        decode (attr_1_eval, 'Undetermined', 1, 0) as undetermined
      from product
      union all
      select
        'attr_2',
        decode (attr_2_eval, 'Correct', 1, 0),
        decode (attr_2_eval, 'Incorrect', 1, 0),
        decode (attr_2_eval, 'Undetermined', 1, 0)
      from product
      union all
      select
        'attr_3',
        decode (attr_3_eval, 'Correct', 1, 0),
        decode (attr_3_eval, 'Incorrect', 1, 0),
        decode (attr_3_eval, 'Undetermined', 1, 0)
      from product
    )
    group by Attribute_Name
    

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 2011-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多