首页 > 解决方案 > SQL 的 SUMIF 和 COUNTIF

问题描述

我有一些看起来像这样的数据:

col1, col2, col3
A,    1.2,  A|X|Y|Z
B,    0.3,  B|X|Y|Z
X,    1.0,  X|Y|Z
Y,    0.2,  Y|Z
Z,    1.0,  Z

我想选择 col1 中的项目出现在 col3 管道分隔列表中的行,而不是它自己的列表。对于这些项目中的每一个,我想计算该项目出现在 col3 中的行数,以及满足该条件的 col2 的总和。所以结果应该是这样的:

col1, foo,  bar
X,    2,    1.5
Y,    3,    2.5
Z,    4,    2.7

我一直在尝试使用 CASE WHEN 和 LIKE 来做到这一点(见下文),但它不起作用。对于 foo 我得到全零,对于 bar 我得到空值。也许我需要某种我不明白如何使用的子查询?

SELECT
  col1,
  COUNT(CASE WHEN col3 LIKE col1 THEN 1 END) as foo,
  SUM(CASE WHEN col3 LIKE col1 THEN col2 END) as bar

FROM table

GROUP BY
  col1

标签: sql

解决方案


您可以通过自加入来做到这一点。在标准 SQL 中,它看起来像:

select t.col1, count(*) as foo, sum(col2) as bar
from t join
     t t2
     on '|' || t2.col3 || '|' like '%|' || t.col1 || '|%'
group by t.col1;

您实际使用的数据库中的语法可能会有所不同,但该想法应该适用于您的数据库使用的任何字符串连接机制。


推荐阅读