sql - 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 中,它看起来像:
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;
您实际使用的数据库中的语法可能会有所不同,但该想法应该适用于您的数据库使用的任何字符串连接机制。
推荐阅读
- raspberry-pi3 - 通过代码重置 Raspberry Pi 3 Model B
- php - mysql选择不同并丢弃其他
- web-services - 我可以为我的网络服务使用端口 443 还是保留此端口?
- java - 我们如何从 gradle 中的 jar 文件加载共享库(.so)?
- vue.js - 无法使用 Vue2 Smooth Scroll 构建 Gridsome 网站
- python - 在 Pandas 中使用 Groupby 后如何计算组中的项目数
- c# - sharpziplib FastZip 提取 rar 错误找不到中央目录 c#
- flutter - 如何确保代码在小部件中只运行一次?
- mysql - 查找具有唯一姓氏的所有用户
- sql - 使用唯一编号的行之间的关系