mysql SQL在每个日期的一行中获取不同用户类型的计数

628mspwn  于 2022-12-26  发布在  Mysql
关注(0)|答案(2)|浏览(139)

我有一个国家列表,对于每个国家,我都有一个如下所示的表格(第一列:user,第二列:user_type,第三列:date):
| 用户|用户类型|日期|
| - ------| - ------| - ------|
| 用户1|国家|二○二二年十月一日|
| 用户1|国家|二○二二年十月一日|
| 用户2|国家|二○二二年十月一日|
| 用户2|国际|二○二二年十月一日|
| 用户3|国家|二○二二年十月二日|
| 用户1|不详|二○二二年十月二日|
| 用户1|国家|二〇二二年十月三日|
我希望每天在一行中获取每种类型的所有不同用户,如下所示(4列:日期、第一用户类型、第二用户类型、第三用户类型):
| 日期|第一用户类型|第二用户类型|第三用户类型|
| - ------| - ------| - ------| - ------|
| 二○二二年十月一日|第二章|1个|无|
| 二○二二年十月二日|1个|无|1个|
| 二〇二二年十月三日|1个|无|无|
但是,如果运行此查询:

SELECT 
date, user_type, COUNT(distinct user) as num_users
FROM "country"."table" 
WHERE 
date between '2022-10-01' AND '2022-10-03' 
GROUP BY date, user_type 
ORDER BY date, user_type

然后我得到了正确的结果,但同一日期在不同的行中,如下所示:
| 日期|用户类型|用户数|
| - ------| - ------| - ------|
| 二○二二年十月一日|国家|第二章|
| 二○二二年十月一日|国际|1个|
| 二○二二年十月一日|不详|无|
| 二○二二年十月二日|国家|1个|
| 二○二二年十月二日|国际|无|
| 二○二二年十月二日|不详|1个|
| 二〇二二年十月三日|国家|1个|
| 二〇二二年十月三日|国际|无|
| 二〇二二年十月三日|不详|无|
但还有一个额外的困难:全球共有3个user_types:"National"、"International"和"Unknown",但问题是有些国家只有"National",或者"National"和"Unknown"(没有"International"),我希望结果显示为0(即使那个user_type在那个国家不存在),查询应该对所有国家都一样,只更改"country"。
(P.S:查询应在AWS Athena中运行)
有什么想法吗?

pokxtpni

pokxtpni1#

条件聚合应在以下位置执行:

SELECT date_, 
       COUNT(DISTINCT IF(user_type = 'National'     , user_, NULL)) AS numNational,
       COUNT(DISTINCT IF(user_type = 'International', user_, NULL)) AS numInternational,
       COUNT(DISTINCT IF(user_type = 'Unknown'      , user_, NULL)) AS numUnknown
FROM tab
GROUP BY date_

检查here演示。

rdlzhqv9

rdlzhqv92#

SELECT date,
       SUM(CASE WHEN user_type = 'National' THEN 1 ELSE 0 END) AS National,
       SUM(CASE WHEN user_type = 'International' THEN 1 ELSE 0 END) AS International,
       SUM(CASE WHEN user_type = 'Unknown' THEN 1 ELSE 0 END) AS Unknown
FROM "country"."table"
WHERE date BETWEEN '2022-10-01' AND '2022-10-03'
GROUP BY date

希望这能有所帮助!

相关问题