SQL: как использовать «УПОРЯДОЧИВАТЬ ПО» и «ГРУППИРОВАТЬ ПО» вместе?

#sql

#sql

Вопрос:

У меня есть база данных со списком пассажиров и весом их багажа. Мне нужно отобразить каждого уникального пассажира и общий вес их багажа (у пассажиров может быть более 1 записи для багажа) и отобразить их в порядке убывания.

Мое текущее решение, которое не работает, заключается в следующем:

 SELECT PassengerID, Weight
FROM Baggage
GROUP BY PassengerID
ORDER BY Weight DESC;
  

Комментарии:

1. Имейте в виду, что предложение group by без агрегатной функции в предложении select устарело и в конечном итоге будет устранено.

2. @TGray, устарел? По мнению кого? С каких пор?

3. @jarlh В версиях 5.6 и новее, строгий режим sql должен быть отключен для того, чтобы были разрешены такие вещи, как неагрегатная группировка по и нулевые даты.

4. @TGray, ты говоришь здесь о MySQL? Я говорил о стандарте ANSI SQL. (Единственным тегом является SQL, что означает, что предполагается SQL ISO / ANSI.) Кстати, разве это новое ограничение MySQL не противоположно, вы должны перечислять неагрегированные столбцы в GROUP BY, точно так же, как всегда был ANSI SQL?

5. Учитывая структуру его запроса, я предположил, что он использовал MySQL, потому что group by без агрегатной функции в предложении select или без предложения having иначе не будет компилироваться. Проблема заключается не столько в перечислении неагрегированных столбцов в GROUP BY, сколько в том, что существует GROUP BY без какой-либо агрегации.

Ответ №1:

Похоже, вы просто хотите суммировать веса:

 SELECT PassengerID, SUM(Weight) AS TotalWeight
FROM Baggage
GROUP BY PassengerID
ORDER BY SUM(Weight) DESC;
  

Комментарии:

1. Я бы сделал ORDER BY TotalWeight DESC вместо этого.

2. @jarlh — Вы не можете упорядочивать по псевдониму столбца в стандартном sql и должны вместо этого снова использовать выражение. Я понятия не имею, нарушает ли какая-либо конкретная база данных (я смотрю на вас, MySQL) стандарт здесь и разрешает это.

3. @Donnie, конечно, ANSI SQL позволяет упорядочивать по псевдонимам столбцов.

4. Вы также можете использовать индексы столбцов. здесь «Order by 2 desc» будет делать то же самое.

5. @jarlh — Вы, конечно, правы. Я думал о group by.

Ответ №2:

Вам нужна агрегатная функция для работы с вашей ГРУППОЙ ПО — в данном случае это была бы сумма:-

 SELECT 
  PassengerID, 
  SUM(Weight)
FROM Baggage
GROUP BY PassengerID
ORDER BY SUM(Weight) DESC;
  

Комментарии:

1. Недопустимый ПОРЯДОК ПО, вес не может быть использован там.

2. Отметил — не уверен, почему я это пропустил

Ответ №3:

 SELECT passenger_Name, SUM(weight) AS 'Total Weight'
FROM baggage
GROUP BY passenger_name
ORDER BY 'Total Weight' DESC;