我有一个包含EMAIL_ADDRESS和语言的数据。我想按语言计算电子邮件地址,然后将结果显示在一行中
CHINESE PORTUGUESE KOREAN SPANISH FRENCH
2 1 1 1 1
当我尝试使用case语句时
select
(case when (LANGUAGE = 'CHINESE') THEN count(distinct email_address) END) as CHINESE,
(case when (LANGUAGE = 'FRENCH') THEN count(distinct email_address) END) as FRENCH,
(case when (LANGUAGE = 'PORTUGUESE') THEN count(distinct email_address) END) as PORTUGUESE,
(case when (LANGUAGE = 'SPANISH') THEN count(distinct email_address) END) as SPANISH,
(case when (LANGUAGE = 'KOREAN') THEN count(distinct email_address) END) as KOREAN
from
table1
group by language;
这是我不想要的
CHINESE PORTUGUESE KOREAN SPANISH FRENCH
2 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
应在一行5列中不包含零
答案 0 :(得分:2)
您只需要对那些CASE
表达式求和,并且似乎只需要表级聚合就不需要使用GROUP BY
:
SELECT
COUNT(DISTINCT CASE WHEN LANGUAGE = 'CHINESE' THEN email_address END) AS CHINESE,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'FRENCH' THEN email_address END) AS FRENCH,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'PORTUGUESE' THEN email_address END) AS PORTUGUESE,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'SPANISH' THEN email_address END) AS SPANISH,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'KOREAN' THEN email_address END) AS KOREAN
FROM table1;
如果您想通过更细粒度的方式进行这些汇总,例如用户,然后GROUP BY
用户列并选择它:
SELECT
userId,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'CHINESE' THEN email_address END) AS CHINESE,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'FRENCH' THEN email_address END) AS FRENCH,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'PORTUGUESE' THEN email_address END) AS PORTUGUESE,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'SPANISH' THEN email_address END) AS SPANISH,
COUNT(DISTINCT CASE WHEN LANGUAGE = 'KOREAN' THEN email_address END) AS KOREAN
FROM table1
GROUP BY
userId;
答案 1 :(得分:0)
我认为我建议先进行distinct
:
SELECT SUM(CASE WHEN LANGUAGE = 'CHINESE' THEN 1 ELSE 0 END) AS CHINESE,
SUM(CASE WHEN LANGUAGE = 'FRENCH' THEN 1 ELSE 0 END) AS FRENCH,
SUM(CASE WHEN LANGUAGE = 'PORTUGUESE' THEN 1 ELSE 0 END) AS PORTUGUESE,
SUM(CASE WHEN LANGUAGE = 'SPANISH' THEN 1 ELSE 0 END) AS SPANISH,
SUM(CASE WHEN LANGUAGE = 'KOREAN' THEN 1 ELSE 0 END) AS KOREAN
FROM (SELECT DISTINCT email_address, language
FROM table1
) t1;
在更大的表格上,比较这两种方法的性能将很有趣。但是我希望一个DISTINCT
比五个更快。