将两行数据集转换为一列

时间:2018-03-04 14:23:59

标签: sql database sqlite pivot

我有一个像这样(简化)的团队之间的游戏数据库:

enter image description here

我想知道到目前为止所有比赛的得分。我可以通过以下方式获得比赛分数:

SELECT match.home, match.away, player.team, COUNT(*) FROM match
    JOIN goal ON match.id = goal.match
    JOIN player ON goal.scorer = player.id

    WHERE match.id = 1 GROUP BY player.team;  -- Specific match
    GROUP BY match.id, player.team;           -- All matches

Home | Away | Team  | Count(*)
-----+------+-------+---------
T1   | T2   | T1    | 3
T1   | T2   | T2    | 1
T3   | T1   | T3    | 0
T3   | T1   | T1    | 2

但是有两个问题:如果一支或两支球队都没有得分,那么表格不会显示球队名称和零。我试图将玩家加入目标,但事实证明他们在SQLite中不受支持。但这是一个较小的问题。

我想以以下形式获取有关目前所有游戏的信息:

MatchID | Home | Away | HomeScore | AwayScore
--------+------+------+-----------+----------
1       | T1   | T2   | 3         | 1
2       | T3   | T1   | 0         | 2

我相信this questionthis one可能是答案,但我不知道如何开始适用于我的案例。我知道,这可能是使用Python或其他外部工具实现的,但我正在寻找一种SQL解决方案。任何帮助将不胜感激!

小提琴链接

以下是SQL小提琴的链接:Fiddle me this

1 个答案:

答案 0 :(得分:0)

考虑加入 Home 汇总结果集和 Away 汇总结果集,每个结果集加入匹配以返回所有匹配项,包括非得分项。

SELECT m.MatchID, m.Home, m.Away, 
       IFNULL(h.Score, 0) AS HomeScore, IFNULL(a.Score, 0) AS AwayScore
FROM 
    Match m
LEFT JOIN
   (SELECT m.MatchID, m.Home, Count(*) As Score 
    FROM Match m
    LEFT JOIN Goal g ON m.MatchID = g.Match 
    INNER JOIN Player p ON g.Player = p.PlayerID AND p.Team = m.Home
   GROUP BY m.MatchID, m.Home) As h 

ON m.MatchID = h.MatchID

LEFT JOIN
   (SELECT m.MatchID, m.Away, Count(*) As Score 
    FROM Team t
    INNER JOIN Match m ON t.Name = m.Away
    LEFT JOIN Goal g ON m.MatchID = g.Match 
    INNER JOIN Player p ON g.Player = p.PlayerID AND p.Team = t.Name
   GROUP BY m.MatchID, m.Away) As a

ON m.MatchID = a.MatchID

SQL Fiddle Demo