У меня есть задание, в котором мне нужно использовать агрегатные функции в запросах. Я продолжаю сталкиваться с проблемой, когда есть несколько записей для одного и того же идентификатора, и я бы предпочел, чтобы они были объединены в один прогон (добавлены вместе для одного и того же идентификатора).
-- Aggregate #3 - Show the total amount of pledges for each Team
-- for particular year. Order the results by amount of pledges highest
-- to lowest. This query should result in 1 row per Team.
-- It should include the Team ID, Team name (or a combination of Sport,
-- Level, and Gender), the total pledge amount and the Event date/year.
SELECT DISTINCT SUM(TEGS.monPledgeAmount) AS TotalPledge
,TE.intEventID
,TTC.intTeamandClubID
,TE.dtmEventDate
,TGS.strGenderDesc
,TLT.strLevelDesc
FROM TEventGolfers AS TEG JOIN TEvents TE
ON TEG.intEventID = TE.intEventID
JOIN TGolfers AS TG
ON TG.intGenderID = TEG.intGolferID
JOIN TEventGolferSponsors AS TEGS
ON TEGS.intEventGolferID = TEG.intEventGolferID
JOIN TEventGolferTeamandClubs AS TEGTC
ON TEGTC.intEventGolferID = TEG.intEventGolferID
JOIN TTeamandClubs AS TTC
ON TTC.intTeamandClubID = TEGTC.intTeamandClubID
JOIN TLevelofTeams AS TLT
ON TLT.intLevelofTeamID = TTC.intLevelofTeamID
JOIN TGenders AS TGS
ON TGS.intGenderID = TTC.intGenderID
GROUP BY
TEGS.monPledgeAmount
,TE.intEventID
,TTC.intTeamandClubID
,TE.dtmEventDate
,TGS.strGenderDesc
,TLT.strLevelDesc
Вывод ниже (идентификаторы должны быть объединены в столбце 3, «intTeamandClubID»):
0.80 2 3 2016-01-01 Female Varsity Football
0.80 2 4 2016-01-01 Male Varsity Golf
4.00 2 3 2016-01-01 Female Varsity Football
4.00 2 4 2016-01-01 Male Varsity Golf
10.00 2 3 2016-01-01 Female Varsity Football
50.00 2 3 2016-01-01 Female Varsity Football
Я хочу, чтобы «intTeamandClubID» был 1 строкой для одного и того же идентификатора, а «TotalPledge» добавлялся вместе.
Согласно Руководство Как спросить, пожалуйста, не размещать изображения кода, данных, сообщений об ошибках и т. д.. Вместо этого скопируйте или введите текст в свой вопрос, отформатировано как код. Зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга; то, что невозможно точно описать текстом.
Подсказка: если вам нужно только каждоеintTeamandClubID
и его общее количество, не выбирайте ничего другого.
Обновил пост с вопросом, чтобы стало понятнее.
Вы хотите суммировать значения TotalPledge
для каждого intTeamandClubID
. Для этого вам нужно будет создать отдельную группу для каждого intTeamandClubID
. В вашем случае, поскольку вы выбираете несколько столбцов, вы создадите группу для каждой уникальной комбинации этих столбцов, что делается с помощью оператора ГРУППА ПО.
У вас уже есть это в вашем запросе, но вы также группируете по TotalPledge
, что вам не нужно. Вы хотите СУММИТЬ это значение, поэтому вам следует удалить его из GROUP BY
:
GROUP BY
TE.intEventID
,TTC.intTeamandClubID
,TE.dtmEventDate
,TGS.strGenderDesc
,TLT.strLevelDesc
Обратите внимание, что, несмотря на то, что это имеет несколько вариантов использования вместе с GROUP BY, DISTINCT
здесь не нужен, поскольку каждая группа (комбинация значений столбцов) уникальна. Однако оставление его в запросе не повлияет на результат.
Вы можете удалить ОТЧЕТЛИВЫЙ в предложении ВЫБРАТЬ и столбец TEGS.monPledgeAmount в предложении ГРУППА ПО.
SELECT SUM(TEGS.monPledgeAmount) AS TotalPledge
,TE.intEventID
,TTC.intTeamandClubID
,TE.dtmEventDate
,TGS.strGenderDesc
,TLT.strLevelDesc
FROM TEventGolfers AS TEG JOIN TEvents TE
ON TEG.intEventID = TE.intEventID
JOIN TGolfers AS TG
ON TG.intGenderID = TEG.intGolferID
JOIN TEventGolferSponsors AS TEGS
ON TEGS.intEventGolferID = TEG.intEventGolferID
JOIN TEventGolferTeamandClubs AS TEGTC
ON TEGTC.intEventGolferID = TEG.intEventGolferID
JOIN TTeamandClubs AS TTC
ON TTC.intTeamandClubID = TEGTC.intTeamandClubID
JOIN TLevelofTeams AS TLT
ON TLT.intLevelofTeamID = TTC.intLevelofTeamID
JOIN TGenders AS TGS
ON TGS.intGenderID = TTC.intGenderID
GROUP BY
TE.intEventID
,TTC.intTeamandClubID
,TE.dtmEventDate
,TGS.strGenderDesc
,TLT.strLevelDesc