Подсчитайте по строкам и отобразите результат в кулонах - PullRequest
0 голосов
/ 21 июня 2019

У меня есть данные, которые имеют EMAIL_ADDRESS и языки.Я хочу посчитать адрес электронной почты по языку, а затем отобразить результат в одну строку

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 ]

2 голосов
/ 21 июня 2019

Вы должны суммировать эти 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;
0 голосов
/ 21 июня 2019

Думаю, я бы порекомендовал сделать сначала 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 будет быстрее пяти.

...