SQL: ВЫБЕРИТЕ СУММУ, ГДЕ СОСТОЯНИЕ - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть некоторые проблемы с запросом SQL: у меня есть такая таблица изображение данных таблицы

Я хотел бы создать представление из этой таблицы, чтобы получить:

Time_A: SUM столбца (total_time_taken) WHERE столбец (is_radiant) = 1

Time_B: SUM того же столбца (total_time_taken) WHERE столбец (is_radiant) = 0

Time_AB: SUM столбца (total_time_taken ) WHERE столбец (is_radiant) = 0 ИЛИ (is_radiant) = 1

SELECT 
    SUM(`matchpickban_radiant`.`total_time_taken`) AS `draft_time_radiant`,
    SUM(`matchpickban_dire`.`total_time_taken`) AS `draft_time_radiant`
FROM
    (`matchpickban` AS `matchpickban_radiant`
    JOIN `matchpickban` AS `matchpickban_dire` ON ((`matchpickban_dire`.`idmatchpickban` = `matchpickban_radiant`.`idmatchpickban`)))
WHERE
    `matchpickban_radiant`.`is_radiant` = 1
    AND `matchpickban_dire`.`is_radiant` = 0

На самом деле я могу выполнить этот запрос без синтаксической ошибки но результат равен NULL, потому что никакие данные не могут быть равны 0 и равны 1 в одно и то же время, очевидно ...

Кроме того, я не знаю, возможно ли сделать JOIN таблицу самой как я это сделал (matchpickban JOIN matchpickban).

Если синтаксис правильный, мне нужно убрать мое ГДЕ СОСТОЯНИЕ, но не знаю как, можно ли заменить его на 2 IF заявление (IF is_radiant = 0 SUM (...))

Спасибо за чтение и помощь в решении этой проблемы, которую я получил! Если вам нужна дополнительная информация о столе или запросе, я дам вам все, что вам нужно!

1 Ответ

2 голосов
/ 12 февраля 2020

Нет необходимости в самостоятельном объединении или сложной логике c, вы можете просто использовать условное агрегирование, которое состоит в использовании условного выражения в агрегатных функциях.

В MySQL , вы могли бы go:

select 
    sum(is_radiant * total_time_taken) time_a,
    sum((1 - is_radiant) * total_time_taken) time_b,
    sum(total_time_taken) time_ab
from matchpickban
where is_radiant in (0, 1)

Это работает, потому что is_radiant состоит только из 0 /1 значений - так что это упрощает логику c. Более канонический способ сформулировать условные суммы:

sum(case when is_radiant = 1 then total_time_taken else 0 end) time_a,
sum(case when is_radiant = 0 then total_time_taken else 0 end) time_b,
...