Получаем общее значение из каждого поля?

#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. Извините за это, вот так.