SQL 查询对多列中的条目进行计数

标签 sql sql-server t-sql

我有一个包含两个表的数据库:tblPlayers 和 tblMatches。

tblPlayers 包含以下字段:playerID、playerName。

tblMatches 包含 matchID、scorer1ID、scorer2ID、scorer3ID。

我需要运行一个查询来计算一名球员的进球总数,并返回其球员 ID。

我尝试了以下方法:

SELECT
tblPlayers.playerID, tblPlayers.playerName, count(*) AS goals
FROM
tblPlayers, matches
WHERE
(tblPlayers.playerID = tblMatches.scorer1ID
OR
tblPlayers.playerID = tblMatches.scorer2ID
OR
tblPlayers.playerID = tblMatches.goalscorer3ID)
GROUP BY tblPlayers.playerID
ORDER BY goals DESC

但是,这并不能按要求工作,因为计数函数不允许球员在一场比赛中进球超过一个进球(例如,如果球员进球三个进球,他的 ID 会出现在 Scorer1ID 中)字段、scorer2ID 字段和 Scorer3ID 字段,但计数只返回值 1,而当需要为 3 时)。

希望这是有道理的,过去几天我一直在努力解决这个问题!非常感谢任何帮助。

最佳答案

SELECT
    playerID,
    playerName,
    SUM(goals) AS goals
FROM 
(
    SELECT p.playerID, p.playerName, COUNT(*) AS goals
    FROM 
        tblPlayers p
        JOIN tblMatches m ON m.scorer1ID = p.playerID
    GROUP BY p.playerID, p.playerName

    UNION ALL

    SELECT p.playerID, p.playerName, COUNT(*) AS goals
    FROM 
        tblPlayers p
        JOIN tblMatches m ON m.scorer2ID = p.playerID
    GROUP BY p.playerID, p.playerName

    UNION ALL

    SELECT p.playerID, p.playerName, COUNT(*) AS goals
    FROM 
        tblPlayers p
        JOIN tblMatches m ON m.scorer3ID = p.playerID
    GROUP BY p.playerID, p.playerName
) sub
GROUP BY playerID, playerName

或者,这里有一个一次性执行此操作的查询:

SELECT 
    p.playerID, 
    p.playerName, 
    SUM (
        CASE WHEN p.playerID = m.scorer1ID THEN 1 ELSE 0 END +
        CASE WHEN p.playerID = m.scorer2ID THEN 1 ELSE 0 END +
        CASE WHEN p.playerID = m.scorer3ID THEN 1 ELSE 0 END
    ) AS goals
FROM 
    tblPlayers p
    JOIN tblMatches m ON p.playerID IN (m.scorer1ID, m.scorer2ID, m.scorer3ID)
GROUP BY p.playerID, p.playerName

关于SQL 查询对多列中的条目进行计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10036311/

相关文章:

php - 您如何使用时间戳列计算每天的不同值?

java - 将我的 Java 应用程序连接到 SQL Server 2012

sql - 每列在单独的行中

c# - 如何检测 SQL Server 2008 中是否正在使用实体?

sql-server - 示例更新查询的 SQL Server 查询优化

sql - sql计数是如何工作的?

sql - 更好的 SQL 计算带有 where 子句的项目数

mysql - 从 UDF 返回一个值。 (MySQL)

sql-server - while 循环内的错误处理

sql - 如何使用 SQL 对 varchar 中的 varchar 进行计数