sqlite查询,根据另一个表的值获取表

kxeu7u2r  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(349)

我不知道什么标题必须在这里正确反映我的问题,我只能描述我想要的。
有一个包含字段的表:

id, name, city

下一行是:

1 John London
2 Mary Paris
3 John Paris
4 Samy London

我想得到这样的结果:

London  Paris
Total   2       2
John    1       1
Mary    0       1
Samy    1       0

所以,我需要取name的所有唯一值,并为另一个字段(city)的唯一值找到一个合适的数量,我还想得到每个city的总数
简单的方法是:
1) 获取唯一名称的列表

SELECT DISTINCT name FROM table

2) 获取独特城市的列表

SELECT DISTINCT city FROM table

3) 为每个名字和城市创建一个查询

SELECT COUNT(city) FROM table WHERE name = some_name AND city = some_city

4) 获取总计:

SELECT COUNT(city) FROM table WHERE name = some_name

(我没有测试这些查询,所以这里可能有一些错误,但这只是为了说明这个想法)
因为有3个名字和2个城市->32=6个数据库查询
但是对于一个有100个城市和100个名字的表->100
100=10000个对db的查询,这可能需要很多时间。
而且,名字和城市可能会改变,所以,我不能用预定义的名字或城市创建查询,因为每天都是新的,所以,可能不是伦敦和巴黎,而是莫斯科、都灵和柏林。名字也是一样。
如何使用sqlite对原始表进行一两次查询就得到这样的表?
(sqlite:我是为android做的)

5uzkadbs

5uzkadbs1#

@gmb给了我使用 group by ,但正如我在android上为sqlite所做的那样,答案如下:

SELECT name,
COUNT(CASE WHEN city = :london THEN 1 END) as countLondon, 
COUNT(CASE WHEN city = :paris THEN 1 END) as countParis 
FROM table2 GROUP BY name

哪里 :london 以及 :paris 传递参数,并且 countLondon 以及 countParis 是响应类的字段

ih99xse1

ih99xse12#

您可以使用条件聚合获得每个名称的结果。至于total,不幸的是sqlite不支持 with rollup 子句,它将自动生成它。
一种解决方法是 union all 另外还有一列用于排序:

select name, london, paris
from (
    select name, sum(city = 'London') london, sum(city = 'Paris') paris, 1 prio
    from mytable
    group by name
    union all
    select 'Total', sum(city = 'London'), sum(city = 'Paris'), 0
    from mytable
) t
order by prio, name

实际上,子查询可能不是必需的:

select name, sum(city = 'London') london, sum(city = 'Paris') paris, 1 prio
from mytable
group by name
union all
select 'Total', sum(city = 'London'), sum(city = 'Paris'), 0
from mytable
order by prio, name

相关问题