2017-03-17 24 views
2

要开始在我原来的问题是太具体的问题: 我有一个匹配的表格式:如何连接两个表,其中一些行保持部分空白?

ID|Player1|Player2|P1Score|P2Score 
--+-------+-------+-------+------- 
1|  71|  83|  2|  0 
2|  73|  71|  1|  1 
3|  71|  65|  2|  0 
4|  65|  83|  0|  2 

  • 2是一个双赢
  • 1一条领带,
  • 0是一个损失。

我需要得到一个表格式:

Player|Wins|Draws|Losses 
------+----+-----+------ 
    71| 2| 1|  0 
    73| 0| 1|  0 
    83| 1| 0|  1 
    65| 0| 0|  1 

而且我没有太多的想法如何去了解它。

我得到的最接近是

SELECT Player1, COUNT(P1Score) FROM matches WHERE P1Score = 2 GROUP BY Player1 

并重复用于绘制和损失,然后连接表,重复的P2和值相加在一起,但似乎JOIN是不太我需要的命令。

回答

4

2是一个双赢中,1是领带,0是一个损失

鉴于每个的这些条件下,我们可以使用case表达式由score计算出相应的列。使用union all到unpivot的数据,然后sum()通过Player聚合它:

select 
    Player 
    , sum(Wins) as Wins 
    , sum(Draws) as Draws 
    , sum(Losses) as Losses 
from (
    select 
     Player1 as Player 
    , case when p1score = 2 then 1 else 0 end as Wins 
    , case when p1score = 1 then 1 else 0 end as Draws 
    , case when p1score = 0 then 1 else 0 end as Losses 
    from t 
    union all 
    select 
     Player2 as Player 
    , case when p2score = 2 then 1 else 0 end as Wins 
    , case when p2score = 1 then 1 else 0 end as Draws 
    , case when p2score = 0 then 1 else 0 end as Losses 
    from t 
) as s 
group by Player 
+0

您必须将p1score与p2score进行比较才能使代码具有通用性。例如,如果你有一个新的条目,那么得分(两个玩家)等于3?你的逻辑将被打破 – Andrade

+1

@Andrade:当两名球员参加比赛时,只有3种可能的结果。这些结果被编码为“2”,“1”,“0”。 –

+1

@Andrade问题说:“2是胜利,1是平局,0是损失”。这不是关于目标,而是结果。像国际象棋。 – SqlZim

1

如果在比赛表,你有得分,而不是为赢,损失数字代码这应该工作,并得出:

SELECT Player, SUM(WIN) AS WINS, SUM(DRAW) AS DRAWS, SUM(LOSS) AS LOSSES 
FROM ( 
--Create a sub query where each row is how a player did in a given match 
SELECT A.Player, 
    (CASE WHEN (A.Player = B.Player1 AND B.P1Score>B.P2Score) 
     OR (A.Player = B.Player2 AND B.P2Score>B.P1Score) THEN 1 ELSE 0 END) WIN,  
    (CASE WHEN (A.Player = B.Player1 AND B.P1Score<B.P2Score) 
     OR (A.Player = B.Player2 AND B.P2Score<B.P1Score) THEN 1 ELSE 0 END) LOSS, 
    (CASE WHEN B.P1Score=B.P2Score THEN 1 ELSE 0 END) DRAW 
FROM (
    SELECT DISTINCT Player 
    FROM (
    SELECT Player1 FROM matches 
    UNION ALL 
    SELECT Player2 FROM matches 
) A 
LEFT JOIN matches B 
) 
相关问题