【问题标题】:SQLite query to get table based on values of another tableSQLite 查询基于另一个表的值获取表
【发布时间】:2020-09-26 20:45:37
【问题描述】:

我不确定这里必须有什么标题才能正确反映我的问题,我只能描述我想要的。

有一个带有字段的表:

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

因此,我需要获取名称的所有唯一值并为另一个字段(城市)的唯一值找到适当的数量 我也想得到每个城市的总量

简单的方法是:

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 个城市 -> 3 * 2 = 6 次查询数据库

但是对于具有 100 个城市和 100 个名称的表 -> 100 * 100 = 10 000 次对数据库的查询 而且可能需要很长时间才能完成。

此外,名称和城市可能会更改,因此,我无法使用预定义的名称或城市创建查询,因为它每天都是新的,因此,可能是莫斯科、都灵和柏林,而不是伦敦和巴黎。名字也是一样。

如何使用sqlite对原始表进行一二查询得到这样的表?

(sqlite: 我是为安卓做的)

【问题讨论】:

    标签: sql sqlite group-by count pivot


    【解决方案1】:

    您可以通过条件聚合获得每个名称的结果。至于总数,遗憾的是 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
    

    【讨论】:

    • 这里的“prio”是什么意思?我在 sqlite 关键字列表中没有看到“prio”
    • @LumisD:这只是附加列的别名,用于对结果集进行正确排序(并将“总计”放在顶部)。我们可以称它为任何名称。
    【解决方案2】:

    @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 是传递参数,countLondoncountParis 是响应类的字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      相关资源
      最近更新 更多