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不同:)