sqlite - 在 sqlite 中对多个可能值进行分组选择
问题描述
我有一个 sqlite3 数据库,其中一个表包含有关测试运行的信息,例如:
表
名称状态时间
testa 通过 33
testb 失败 22
testa 失败 41
testc 通过 18
testa 通过 27
一些测试不时被重命名,例如 testa 到 testa1,可能后来 testa1 到 testa2。所以我的表格最终可能看起来像:
表格
名称状态时间
testa 通过 33
testb 失败 22
testa1 失败 41
testc 通过 18
testa 通过 27
testa2 失败 45
我可以在单独的表中跟踪更改,例如:
表 B
名称别名
测试 测试
1 测试 测试 2
尽管我不确定第二个条目是“testa testa2”还是“testa1 testa2”,但其中一个是否会比另一个更好(理想情况下,任何一个都可以)。我希望能够以某种方式对它们进行分组,所以我的查询将结合别名,所以我的结果看起来像:
testa,testa1,testa2:2 通过 2 失败
testb:0 通过,1 失败
testc:1 通过 0 失败
因此,我需要在查询中执行两个步骤,一个是对 testa、testa1 和 testa2 进行分组,并将该组的结果总和与(未重命名)测试的结果包括在内。我可以通过以下方式完成分组(只要我没有两个以上的别名):
select a.name, a.alias as name1, (select b.alias from B b where a.name = b.name and b.alias != a.alias limit 1) as name2 from B a group by a.name;
其中 B 是别名表,但我不知道如何将其与其他表结合起来:
select name, alias from A left join B on job_table.name = B.name where name not in (select alias from B) group by姓名、别名;
但这给了我成对的别名(testa testa1 在一行,testa testa2 在下一行)并且不能帮助我对这些总数求和。
解决方案
加入表并使用条件聚合:
SELECT COALESCE(b.name, a.name) || COALESCE(',' || GROUP_CONCAT(DISTINCT b.alias), '') test,
SUM(a.status = 'passed') passed,
SUM(a.status = 'failed') failed
FROM tableA a LEFT JOIN tableB b
ON b.alias = a.name
GROUP BY COALESCE(b.name, a.name)
请参阅演示。
结果:
测试 | 通过 | 失败的 |
---|---|---|
测试,测试1,测试2 | 2 | 2 |
测试b | 0 | 1 |
测试c | 1 | 0 |
推荐阅读
- json - Alamofire 响应处理程序的问题
- web - 下载交互式网站以供离线使用
- typescript - 如何通过 git hook 脚本运行 jest?
- reporting-services - 在 SSRS 中使用 IIF 和 DATEPART 在日期列中突出显示月份的第一天
- typescript - 我想知道为什么提供者部分有一个Spread Operator
- oracle - Oracle 本地索引和加载大约 10 亿条数据
- ffmpeg - 使用 ffmpeg 将视频分割成特定长度
- reactjs - 反应路由器未在生产中加载动态网址
- database - 创建了一个 SQLite 文件,但仍然出现错误:文件不是数据库
- maven - Apache Avro maven 插件似乎忽略了配置