Как избежать дубликатов в моем запросе MySQL? - PullRequest
2 голосов
/ 08 мая 2019

Я пытаюсь создать запрос, который - при выполнении - покажет дату, статус (при наличии нескольких опций статуса) и количество событий в эту дату - различаются по статусу.

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

SELECT cast(event_date AS date) AS date, count(event_status) AS amount, status
FROM events
GROUP BY date, status

Прямо сейчас вот что я получаю:

    date    |  amount    |   status   
---------------------------------------
2019-05-07  |    5       |     YES
2019-05-07  |    1       |      NO
2019-05-06  |    4       |     YES
2019-05-05  |    3       |     YES
2019-05-04  |    6       |     YES
2019-05-04  |    2       |    MAYBE

И вот что я хочу получить:

    date    |  POSITVE   |   Negative    
---------------------------------------
2019-05-07  |    5       |      1
2019-05-06  |    4       |      0
2019-05-05  |    3       |      0
2019-05-04  |    6       |      2

, где любой статус, который не равен «Да», является отрицательным.Какие-либо предложения?Просто чтобы уточнить: мой желаемый результат - это только один из вариантов, я знаю, что могут быть разные способы решения моей проблемы, но это мне подходит.Спасибо

Ответы [ 3 ]

2 голосов
/ 08 мая 2019

Вы можете сделать условное агрегирование:

select cast(event_date AS date) AS date,
       sum(case when  status = 'Yes' then 1 else 0 end) as Positive,
       sum(case when  status <> 'Yes' then 1 else 0 end) as Negative
from events e
group by cast(event_date AS date);

Однако, mariaDB имеет сокращенную версию для этого:

select cast(event_date AS date) AS date,
       sum( status = 'Yes' ) as Positive,
       sum( status <> 'Yes' ) as Negative
from events e
group by cast(event_date AS date);
2 голосов
/ 08 мая 2019

Используйте case и Sum как:

SELECT cast(event_date AS date) AS date, 
SUM(CASE WHEN status='YES' THEN 1 ELSE 0 END) as POSITIVE,
SUM(CASE WHEN status !='YES' THEN 1 ELSE 0 END) as NEGATIVE
FROM events
GROUP BY date
1 голос
/ 08 мая 2019

MariaDB - как и MySQL - обрабатывает логические значения как целые числа в числовом контексте. Я бы написал это как:

SELECT cast(event_date AS date) AS date, 
       SUM( status = 'YES' ) as Positive,
       SUM( status <> 'YES' ) as Negative
FROM events
GROUP BY cast(event_date AS date)
...