我正在查询一个表,但我需要不同列中的输出

Posted

技术标签:

【中文标题】我正在查询一个表,但我需要不同列中的输出【英文标题】:I'm querying a table but I need the output in different columns 【发布时间】:2021-10-05 21:19:22 【问题描述】:

假设我有一张桌子,下面是示例

Member ID  | Hotel ID  | Country | 
----------- ----------- ----------
100         ZZA         Country 1
101         ZZA         Country 2
102         ZZB         Country 2
103         ZZC         Country 3
201         XXD         Country 4
202         XXE         Country 1
203         AAB         Country 1

我需要根据不同的规则输出不同国家的会员数量:

规则 1:酒店 ID 以 XX 或 AA 开头的国家/地区的成员数量。 规则 2:成员 ID 以 10 开头的国家/地区的成员计数。

我可以编写 2 个不同的查询来得到这样的输出:

Rule 1
Country  |  Member Count
--------- ----------
Country 4  1
Country 1  2
Rule 2
Country  |  Member Count
--------- ----------
Country 2  2
Country 1  1
Country 3  1

有没有办法在不同的列中有 1 个查询和 1 个输出?像这样:

Country | Rule 1 | Rule 2
-------- -------- --------
Country 1    2       1   
Country 2    0       2
Country 3    0       1 
Country 4    1       0

我正在使用 DB Browser for SQLite,在其中创建了一个表并导入了我正在处理的 CSV 文件。我知道我可以为此使用数据透视表,但它太慢了。

【问题讨论】:

只使用“右外连接”? 我对 1 个表有 2 个单独的查询。我想要 1 个查询结合 2 个输出。 【参考方案1】:

您可以按国家/地区分组并使用条件聚合:

SELECT Country,
       SUM(HotelID LIKE 'XX%' OR HotelID LIKE 'AA%') Rule1,
       SUM(MemberID LIKE '10%') Rule2
FROM tablename
GROUP BY Country;

或者用SUBSTR()代替LIKE

SELECT Country,
       SUM(SUBSTR(HotelID, 1, 2) IN ('XX', 'AA')) Rule1,
       SUM(SUBSTR(MemberID, 1, 2) = '10') Rule2
FROM tablename
GROUP BY Country;

请参阅demo。

【讨论】:

【参考方案2】:

您可以使用表单的单个查询

select Country,
    count(case when <rule1> then 1 end) rule1,
    count(case when <rule2> then 1 end) rule2
from tbl
where (<rule1>) or (<rule2>)
group by Country

db<>fiddle

【讨论】:

您可以接受答案以证明它有效。 后续问题,假设我有另一个表具有相同的规则和国家,但包含来自另一个地区的数据,我如何将这两个结合起来?谢谢! @bixby 。 . .新问题应该作为问题提出,而不是 cmets。 @bixby, .. 你最好再问一个问题并显示所需的输出是什么样的

以上是关于我正在查询一个表,但我需要不同列中的输出的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 数据库/模型设置中用于需要不同列的关系的正确约定?

更新查询以根据不同表中的值更改一个表中列的现有值

遇到错误问题:''之前的预期不合格ID只是一个类的标题,我需要不确定是啥导致错误[关闭]

用于显示多个日期范围之间的间隔的 SQL 查询

需要查询以获取已使用和未使用表的列表[关闭]

我需要创建一个 pyspark UDF,它通过比较从查询中输出一个表