Sql 按行计数并以coulmn显示结果
我有一个有电子邮件地址和语言的数据。我想按语言计算电子邮件地址,然后将结果显示在一行中Sql 按行计数并以coulmn显示结果,sql,oracle,pivot,Sql,Oracle,Pivot,我有一个有电子邮件地址和语言的数据。我想按语言计算电子邮件地址,然后将结果显示在一行中 CHINESE PORTUGUESE KOREAN SPANISH FRENCH 2 1 1 1 1 当我尝试使用case语句时 select (case when (LANGUAGE = 'CHINESE') THEN count(distinct email_address) END) as
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列中,不带零您需要对那些
大小写
表达式求和,而且如果您只想进行表级聚合,似乎也不需要使用分组方式
:
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
user列并将其选中:
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;
您需要对这些
大小写
表达式求和,而且如果您只想进行表级聚合,则似乎不需要使用分组依据
:
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
user列并将其选中:
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;
我想我建议首先执行
独特的:
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
比五个快。我想我建议先做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
比五个快。谢谢Tim..我在里面使用了count DISTINCT,这就是为什么我需要group BY你不需要group BY
使用count DISTINCT:)谢谢Tim..我在里面使用count DISTINCT,这就是为什么我需要group BY你不需要group BY
使用count不同:)