sqlite db的二维选择查询

问题描述 投票:1回答:1

我想生成汇总表来显示我拥有数据库的每个模型的计数(不同的pid):

model corner pid
aa  c1  1
aa  c1  1
aa  c1  2
aa  c2  3
aa  c3  4
bb  c1  1
bb  c1  1
bb  c2  2
bb  c2  3
bb  c2  3
bb  c3  4

结果是这样的:

corner  aa bb
c1      2   1
c2      1   2
c3      1   1

我可以知道我应该使用什么查询命令吗?

sql sqlite
1个回答
1
投票

你可以先得到你想要的数量:

select corner, model, count(distinct pid) as n from t group by corner, model

这给你这个:

corner|model|n
c1    |aa   |2
c1    |bb   |1
c2    |aa   |1
c2    |bb   |2
c3    |aa   |1
c3    |bb   |1

然后通过corner对派生表进行分组,并根据n值对models求和:

select
    corner,
    sum(case when model = 'aa' then n else 0 end) as aa,
    sum(case when model = 'bb' then n else 0 end) as bb
from (
    select corner, model, count(distinct pid) as n
    from t
    group by corner, model
) dt
group by corner

SQLite将布尔值表示为1和0(分别为true和false),因此您可以将其写为:

select
    corner,
    sum(n * (model = 'aa')) as aa,
    sum(n * (model = 'bb')) as bb
from (
    select corner, model, count(distinct pid) as n
    from t
    group by corner, model
) dt
group by corner

但我发现便携式case版本一目了然更容易理解。

两个版本都会产生如下结果:

corner|aa|bb
c1    |2 |1
c2    |1 |2
c3    |1 |1

如果你想让结果由corner排序,那么你应该在查询中包含一个明确的order by corner

select
    corner,
    sum(case when model = 'aa' then n else 0 end) as aa,
    sum(case when model = 'bb' then n else 0 end) as bb
from (
    select corner, model, count(distinct pid) as n
    from t
    group by corner, model
) dt
group by corner
order by corner
© www.soinside.com 2019 - 2024. All rights reserved.