将两行数据集转换为一列
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将两行数据集转换为一列相关的知识,希望对你有一定的参考价值。
我有一个像这样结构的团队之间的游戏数据库(简化):
而且我想知道到目前为止所有比赛的得分。我可以通过以下方式获得比赛分数:
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 question或this one可能是答案,但我不知道如何开始申请我的案子。我知道,这可能是使用Python或其他外部工具实现的,但我正在寻找一种SQL解决方案。任何帮助将不胜感激!
Fiddle link
这是一个SQL小提琴的链接:Fiddle me this
答案
考虑加入一个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
以上是关于将两行数据集转换为一列的主要内容,如果未能解决你的问题,请参考以下文章