SQL Group и вычислить 2 разные агрегированные функции одновременно

Вот как выглядит моя таблица:

    VIDEO_ID  DATETIME APPROVED VIOLATION_COUNT VIDEO_DESCRIPTION
    VIDEO1    2018-01-02 yes    1               a
    VIDEO2    2018-06-02 no     2               b
    VIDEO3    2018-07-04 yes    1               c
    VIDEO4    2018-01-12 yes    1               b
    VIDEO5    2018-06-02 no     2               c
    VIDEO6    2018-07-29 yes    1               a

Мне нужно сгруппировать эту таблицу по VIDEO_TYPE (который я определил с помощью VIDEO_DESCRIPTION, поэтому я использую оператор SWITCH - CASE, см. Запрос ниже). И затем для каждого VIDEO_TYPE мне нужно вычислить 2 вещи:

  • Сумма VIOLATION_COUNT и
  • Сумма VIOLATION_COUNT, где APPROVED = "да".

Поэтому я хочу, чтобы мой запрос возвращал 3 столбца: VIDEO_TYPE, сумму общего VIOLATION_COUNT и сумму VIOLATION_COUNT, где APPROVED = 'да' для каждого из VIDEO_TYPE.

У меня вопрос: как рассчитать сумму VIOLATION_COUNT и сумму VIOLATION_COUNT, где APPROVED = "yes" В ТО ЖЕ ВРЕМЯ?

Вот мой запрос:

  SELECT 
      CASE         
            WHEN VIDEO_DESCRIPTION = 'a'                THEN 'Video type 1'
            WHEN VIDEO_DESCRIPTION = 'b'                THEN 'Video type 2'
            WHEN VIDEO_DESCRIPTION = 'c'                THEN 'Video type 3'
            ELSE 'Others' END AS VIDEO_TYPE,

      SUM(VIOLATION_COUNT) AS VIOLATION_COUNT,
      (select count(APPROVED) where APPROVED = 'yes') AS TRUE_POSITIVE_VIOL_COUNT, -- THIS IS NOT WORKING

    FROM my_table
    GROUP BY 
    VIDEO_TYPE

Этот запрос дает мне эту ошибку:

Invalid operation: subquery uses ungrouped column "my_table.approved" from outer query;

Вам необходимо реализовать «условную агрегацию», где COUNT эмулируется через SUM с CASE.

PM 77-1 22.05.2018 19:17
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете добавить СУММУ (СЛУЧАЙ), чтобы решить этот вопрос:

SELECT CASE WHEN VIDEO_DESCRIPTION = 'a' THEN 'Video type 1'
            WHEN VIDEO_DESCRIPTION = 'b' THEN 'Video type 2'
            WHEN VIDEO_DESCRIPTION = 'c' THEN 'Video type 3'
            ELSE 'Others' END AS VIDEO_TYPE,
      SUM(VIOLATION_COUNT) AS VIOLATION_COUNT,
      SUM(CASE WHEN APPROVED = 'yes' THEN 1 ELSE 0 END) AS TRUE_POSITIVE_VIOL_COUNT
FROM     tbl
GROUP BY VIDEO_DESCRIPTION;
VIDEO_TYPE   | VIOLATION_COUNT | TRUE_POSITIVE_VIOL_COUNT
:----------- | --------------: | -----------------------:
Video type 1 |               2 |                        2
Video type 2 |               3 |                        1
Video type 3 |               3 |                        1

db <> рабочий пример здесь

Другие вопросы по теме