2015-08-11 4 views
0

У меня есть 3 стола.Присоединение к 3 столам для подсчета очков

Team 
    TeamId  Team 
    1  Manchester United 
    2  Arsenal 
    3  Liverpool 

Match  
MatchId HomeTeamId AwayTeamId MatchStartDate 
3   1   2   2/2/2015 
8   3   1   6/2/2015 

Score 
ScoreId MatchId TeamId  ScorTime 
1   3  1  2/2/2015 12:30:00 
2   3  2  2/2/2015 12:35:00 
3   3  1  2/2/2015 12:38:00 
4   8  1  6/2/2015 12:45:00 
5   8  1  6/2/2015 12:49:00 

Я хотел что-то вроде

MatchId HomeTeam   HomeTeamScore AwayTeam  AwayTeamScore MatchDate 
3   Manchester United  2   Arsenal   1  2/2/2015 
8   Liverpool    0  Manchester United 2  6/2/2015 

Я попробовал это, но я не получаю corrent отсчеты.

SELECT COUNT(hscore.MatchId) AS HomeScore 
    , COUNT(ascore.MatchId) AS AwayScore 
FROM Match 
RIGHT OUTER JOIN Score AS hscore 
     ON Match.AwayTeamId = hscore.TeamId 
LEFT OUTER JOIN Score AS ascore 
     ON Match.HomeTeamId = ascore.TeamId 
+0

Ну, вы не говорите нам, что случилось с вашими результатами, так что я возьму догадку. Попробуйте использовать 'count (distinct hscore.MatchId)'. – Andrew

+0

Почему вы использовали правое внешнее соединение и левое? Не следует оставлять их обоих, поскольку вы только заботитесь о счете, если Матч существует. – HLGEM

+0

Это опечатка, что ваш псевдоним hscore (и, следовательно, ваш результат HomeScore) использует AwayTeamId и наоборот? Или это ответ на вашу проблему? –

ответ

0

Вы можете использовать Cross Применить, чтобы действовать как функции, чтобы получить команды Имена и только к югу выберите свои результаты ..

SELECT m.MatchId, 
     ht.Team AS HomeTeam, 
     (SELECT COUNT(*) 
     FROM Score s 
     WHERE s.MatchId = m.MatchId AND s.TeamId = ht.TeamId) AS HomeTeamScore, 
     at.Team AS AwayTeam, 
     (SELECT COUNT(*) 
     FROM Score s 
     WHERE s.MatchId = m.MatchId AND s.TeamId = at.TeamId) AS AwayTeamScore, 
     m.MatchStartDate 
FROM Match m 
     CROSS APPLY (SELECT TeamID, Team FROM Team WHERE TeamId = m.HomeTeamId) ht 
     CROSS APPLY (SELECT TeamID, Team FROM Team WHERE TeamId = m.AwayTeamId) at 

SQL Fiddle

1

попробовать

SELECT Match.Matchid 
    , COUNT(hscore.MatchId) AS HomeScore 
    , COUNT(ascore.MatchId) AS AwayScore 
FROM Match 
LEFT OUTER JOIN Score AS hscore 
     ON Match.HomeTeamId = hscore.TeamId AND Match.Matchid = hscore.Matchid 
LEFT OUTER JOIN Score AS ascore 
     ON Match.AwayTeamId = ascore.TeamId AND Match.Matchid = ascore.Matchid 
GROUP BY Match.Matchid 

Если вы хотите добавить в названиях команд, вам нужно будет присоединиться к столу команды в два раза, но это может быть внутреннее соединение.

+0

Я не вижу таких прав с этим, хотя я думал, что это тоже работает. Sql Fiddle http://sqlfiddle.com/#!3/2bc67/3 – JamieD77

+0

Я использовал ваше соединение, но не заметил, что вы присоединился к команде гостей, чтобы получить домашнюю команду и наоборот. Проверьте исправленную версию. – HLGEM

+0

Левые внешние соединения не подходят для этого случая, и результат будет неправильным, если есть по крайней мере одна информация. В этом случае счетчик для MatchID 3 и Awayteamscore неверен. – XtremeBytes

1

Это должно дать то, что вы хотите

Select MatchID, H.Team as HomeTeam, HomeTeamScore = (Select Count(*) From Score Where MatchID = M.MatchID And TeamID = M.HomeTeamId), A.Team as AwayTeam, AwayTeamScore = (Select Count(*) From Score Where MatchID = M.MatchID And TeamID = M.AwayTeamId), MatchStartDate From Match M Inner Join Team H On M.HomeTeamId = H.TeamID Inner Join Team A On M.AwayTeamId = A.TeamID

+0

Я никогда не рекомендую использовать коррелированный подзапрос, они убивают производительность. – HLGEM

+0

Да, но он работает и может быть настроен на производительность позже, если потребуется. – XtremeBytes

0
SELECT 
    m.MatchID 
    ,ht.Team HomeTeam 
    ,htscore.score HomeTeamScore 
    ,at.Team AwayTeam 
    ,atscore.score AwayTeamScore 
    ,m.MatchStartDate MatchDate 
FROM Match m 
INNER JOIN Team ht ON m.HomeTeamID=ht.TeamID 
INNER JOIN Team at ON m.AwayTeamID=at.TeamID 
INNER JOIN (
    SELECT MatchID,TeamID,COUNT(*) score 
    FROM Score 
    GROUP BY MatchID,TeamID 
) htscore ON htscore.MatchID=m.MatchID AND htscore.TeamID=ht.TeamID 
INNER JOIN (
    SELECT MatchID,TeamID,COUNT(*) score 
    FROM Score 
    GROUP BY MatchID,TeamID 
) atscore ON atscore.MatchID=m.MatchID AND atscore.TeamID=at.TeamID 
0

Это моя версия:

WITH Scores (MatchId, TeamId, cnt) AS (
    SELECT MatchId, TeamId, COUNT(*) 
    FROM Score 
    GROUP BY MatchId, TeamId 
) 
SELECT Match.Matchid, 
     COALESCE(h.cnt, 0) AS HomeScore, 
     COALESCE(a.cnt, 0) AS AwayScore 
FROM Match 
LEFT OUTER JOIN Scores h ON Match.MatchId = h.MatchId AND Match.HomeTeamId = h.TeamId 
LEFT OUTER JOIN Scores a ON Match.MatchId = a.MatchId AND Match.AwayTeamId = a.TeamId 

SQL Fiddle

Смежные вопросы