首页 > 解决方案 > 在 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 在下一行)并且不能帮助我对这些总数求和。

标签: sqlite

解决方案


加入表并使用条件聚合:

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

推荐阅读