将两行数据集转换为一列

问题描述 投票:2回答:1

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

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解决方案。任何帮助将不胜感激!

Fiddle link

这是一个SQL小提琴的链接:Fiddle me this

sql database sqlite pivot
1个回答
0
投票

考虑加入一个Home聚合结果集和一个Away聚合结果集,每个结果集连接到Match以返回所有匹配,包括非得分的匹配。

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

© www.soinside.com 2019 - 2024. All rights reserved.