【问题标题】:SQL Counting multiple columns for same ID in same tableSQL计算同一张表中相同ID的多列
【发布时间】:2014-11-26 20:56:38
【问题描述】:

我有一个包含 GameID, GoalID, PlayerID, Assist1ID, Assist2ID 列的表(所有整数)。 PlayerID 翻译为实际进球的人的ID,但Assist1IDAssist2ID 也可以获得球员ID。

我正在尝试获取具有不同 PlayerID 的数据集(来自 PlayerID 列或任一助攻列)、进球数(PlayerID 列)和助攻数(其中实际上是 Assist1Assist2 发生 playerID 时计数列的总和)。 PlayerID 永远不会出现在这些列中的一个以上。

我一直在尝试几种方法,主要是使用 UNION ALL,以及一些 SUM/CASE,但我就是不明白。我应该为此使用临时表,还是有办法检查行,如果PlayerID

示例:(请注意,GoalIDGameID 在这种情况下并不重要)

GameID | GoalID | PlayerID   | Assist1ID | Assist2ID
  1    |    1   |     1876   |   2098    |     1097 
  1    |    2   |     2098   |   1829    |     1876 
  1    |    3   |     2098   |   1876    |     ---- 

我的查询应该返回:

PlayerID | Goals   | Assists
 1876    |    1    |    2
 2098    |    2    |    1
 1829    |    0    |    1
 1097    |    0    |    1

这真的可能吗,还是我必须在代码部分做一些工作?

【问题讨论】:

  • 我猜你可能在其他表中有玩家 ID。你可以很容易地加入这个表。
  • 我没有解决方案,但我创建了一个 SQL 小提琴,它至少为任何想要查看的人提供了架构和示例数据:sqlfiddle.com/#!6/11e3b/1/0

标签: sql-server count multiple-columns


【解决方案1】:

为确保您获得每个参与的玩家的结果记录,无论他们是只参与、只协助还是两者都参与,您必须三次检查您的数据并将记录与 UNION ALL 粘合在一起。然后数数。

select playerid, sum(goal) as goals, sum(assist) as assists
from
(
  select playerid, 1 as goal, 0 as assist from mytable
  union all
  select assist1id, 0 as goal, 1 as assist from mytable
  union all
  select assist2id, 0 as goal, 1 as assist from mytable
)
group by playerid;  

【讨论】:

  • 我先尝试了这个,所以我将其标记为正确答案,但我也尝试了其他选项,CrimsonKing 的选项给了我与此相同的结果。我不确定在这种情况下分配分数的适当礼仪。
  • @jungalist 随心而行
【解决方案2】:

可以这样做,但我感觉可能有更简单的解决方案。

SELECT PlayerID, SUM(Goals), SUM(Assists)
FROM (
    SELECT PlayerID,Count(*) AS Goals,0 AS Assists FROM Goals GROUP BY PlayerID UNION ALL
    SELECT Assist1ID,0,Count(*) FROM Goals GROUP BY Assist1ID UNION ALL 
    SELECT Assist2ID,0,Count(*) FROM Goals GROUP BY Assist2ID
) T
WHERE NOT PlayerID IS NULL
GROUP BY PlayerID

【讨论】:

    【解决方案3】:
    SELECT x.playerid
         , SUM(y.playerid = x.playerid) goals
         , SUM(x.playerid IN (y.assist1id,y.assist2id)) assists
      FROM 
         ( SELECT playerID FROM my_table 
            UNION 
           SELECT assist1id FROM my_table 
            UNION  
           SELECT assist2id FROM my_table
         ) x
      LEFT
      JOIN my_table y
        ON x.playerid IN(y.playerid,y.assist1id,y.assist2id)
     WHERE x.playerid IS NOT NULL
     GROUP
        BY playerid;
    

    【讨论】:

    • 这个选项在我尝试执行它时导致了几个错误。它们是:消息 102、级别 15、状态 1、第 2 行 '=' 附近的语法不正确。消息 102,级别 15,状态 1,第 10 行 'x' 附近的语法不正确。其他部分也被编辑划了下划线,但我玩的时间不够长,无法全部弄清楚
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多