繁体   English   中英

查询单个表中字段值的计数

[英]Querying Counts on Field Values in a Single Table

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

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

我需要编写一个查询,以汇总所有产品的属性评估(其中不为null):

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中提供帮助都将受到欢迎。

你能做三个工会吗?

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

这可能不是最优雅/最有效的解决方案,但它应该可以满足您的要求

这有点蛮力,我讨厌它会扫描表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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM