Дубликат подсчитывает при попытке использовать два объединения в одном запросе - PullRequest
0 голосов
/ 25 марта 2020

Я довольно новичок в SQL и мне интересно, как объединить эти два запроса. Всякий раз, когда я пытаюсь объединить их, счет становится одинаковым. По сути, моя цель состоит в том, чтобы получить суммарные карьерные индивидуальные победы MVP и общую карьерную награду MVP каждого игрока.

SELECT p.nameLast, p.nameFirst, p.playerID, COUNT(asp.playerID) AS Shared_MVPs
FROM players AS p
JOIN awardsshareplayers AS asp ON asp.playerID = p.playerID
WHERE asp.awardID = 'MVP' 
GROUP BY  p.nameLast, p.nameFirst, p.playerID
ORDER BY p.nameLast

SELECT p.nameLast, p.nameFirst, p.playerID, COUNT(ap.playerID) AS Solo_MVPs
FROM players AS p
JOIN awardsplayers AS ap ON  ap.playerID = p.playerID
WHERE awardID LIKE '%MVP%' 
GROUP BY  p.nameLast, p.nameFirst, p.playerID
ORDER BY p.nameLast

Примеры таблиц:

Tables Examples(players, awardsshareplayers, awardsplayers):

1 Ответ

2 голосов
/ 25 марта 2020

Вы должны выполнить агрегацию в производных таблицах, чтобы избежать репликации строк в JOIN s, используя LEFT JOIN и COALESCE, чтобы иметь дело с игроками, которые получили награды Solo, но не Shared, и наоборот:

SELECT p.nameLast, p.nameFirst, p.playerID, 
       COALESCE(asp.Shared_MVPs, 0) AS Shared_MVPs, 
       COALESCE(ap.Solo_MVPs, 0) AS Solo_MVPs
FROM players AS p
LEFT JOIN (SELECT playerID, COUNT(*) AS Shared_MVPs
           FROM awardsshareplayers
           WHERE awardID = 'MVP'
           GROUP BY playerID) AS asp ON asp.playerID = p.playerID
LEFT JOIN (SELECT playerID, COUNT(*) AS Solo_MVPs
           FROM awardsplayers
           WHERE awardID LIKE '%MVP%'
           GROUP BY playerID) AS ap ON ap.playerID = p.playerID
ORDER BY p.nameLast
...