#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;