#mysql #sql #database
#mysql #sql #База данных
Вопрос:
Как мне получить общее значение Да, Нет, других полей каждого имени пользователя?
Мне нравится добавлять поле Total.
SELECT Username,
SUM(CASE WHEN type = 'Yes' THEN 1 ELSE NULL END) as Yes,
SUM(CASE WHEN type = 'No' THEN 1 ELSE NULL END) as No,
SUM(CASE WHEN type = '' THEN 1 ELSE NULL END) as Other
//How to get total of Yes/No/Other
FROM table
WHERE source = 'CompanyName' ";
Кроме того, наибольшая сумма идет в верхнем заказе.
Ответ №1:
используйте 0 вместо NULL
, добавьте недостающее group by
и используйте COUNT(*)
, чтобы получить общее количество по каждой группе и упорядочить результат:
SELECT Username,
SUM(CASE WHEN type = 'Yes' THEN 1 ELSE 0 END) as Yes,
SUM(CASE WHEN type = 'No' THEN 1 ELSE 0 END) as No,
SUM(CASE WHEN type = '' THEN 1 ELSE 0 END) as Other,
COUNT(*) as TOTAL
FROM table
WHERE source = 'CompanyName'
group by Username
order by TOTAL desc;
Это предполагает, что type
может быть только «Да», «Нет» или «.
Комментарии:
1. Спасибо за предложение. Как насчет общего?
2.
count(*)
Имеет смысл, но не вернет то же значение, если там есть какие-либоtype = 'maybe'
значения.3. Также
order by COUNT(*) desc
, поскольку в противном случае наибольшее общее значение будет последним.4. @Keith: Спасибо, что заметили недостающее
desc
. О других типах: Да, вы правы, и я на самом деле уже объясняю это в своем ответе.5. Если вам действительно нужно убедиться в типах, что-то вроде
SUM(CASE WHEN type IN ('Yes', 'No', '') THEN 1 ELSE 0 END)
должно работать нормально.
Ответ №2:
Используйте вложенный запрос, чтобы суммировать ваши результаты и добавить сортировку:
select yes, no, other, yes no other as Total
from (
SELECT Username,
SUM(CASE WHEN type = 'Yes' THEN 1 ELSE 0 END) as Yes,
SUM(CASE WHEN type = 'No' THEN 1 ELSE 0 END) as No,
SUM(CASE WHEN type = '' THEN 1 ELSE 0 END) as Other
FROM table
WHERE source = 'CompanyName'
)
order by (yes no other) desc
Комментарии:
1. @Johan — Возможно, я неправильно это прочитал, но разве он не хочет получить общее значение и отсортировать его по убыванию?
2. пропустил это, слишком увеличил значение sum (1,1,1, null).
3. Кстати, вы можете заказать по псевдониму, вам не нужно повторять выражение в вашем предложении order by. Это ускорит процесс.
Ответ №3:
Не используйте SUM(null), сумму (1,1,1,null) = null, а не 3.
SELECT s.*, s.yes s.no s.other as all FROM (
SELECT Username,
SUM(CASE WHEN type = 'Yes' THEN 1 ELSE 0 END) as Yes,
SUM(CASE WHEN type = 'No' THEN 1 ELSE 0 END) as No,
SUM(CASE WHEN type = '' THEN 1 ELSE 0 END) as Other
FROM table
WHERE source = 'CompanyName'
GROUP BY Username
) s
ORDER BY all DESC
Комментарии:
1. Спасибо за предложение. Как насчет общего?
2. Извините за это, вот так.