按行计数并显示结果

时间:2019-06-21 05:29:32

标签: sql oracle pivot

我有一个包含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列中不包含零

2 个答案:

答案 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比五个更快。