【发布时间】:2014-12-12 16:08:18
【问题描述】:
我有 3 列数据。第 1 列是学生的姓名,第 2 列是他们玩的游戏的名称。他们可以玩 10 种可能的游戏,并简称为游戏 1 到游戏 10'。第 3 列包含学生在游戏中获得的分数,它可能是正数或负数。学生可以玩 10 场比赛中的任何一场比赛 0 次到多次(无限制)。每次学生玩任何游戏时,都会创建一行数据。
我想总结学生在 10 场比赛中的任何一场比赛中获得的所有分数,按学生排序。因此,行标题将是学生姓名,列标题将是游戏名称(游戏 1 到游戏 10)。
这是我一直在做的代码:
SELECT [STUDENT],
SUM ( [SCORE])
FROM [Students].[dbo].GameScores
WHERE [GAME] = 'GAME 1' --swap in the game name that you want
GROUP BY [STUDENT]
我为 10 场比赛中的每场运行上述代码 10 次,将第 1 场比赛换成第 2 场比赛,然后是第 3 场比赛,依此类推。然后我会根据需要手动将结果剪切并粘贴到 Excel 中。随着游戏数量的增加(达到 100 个),我显然不想运行上面的代码来手动提取所有 100 个游戏的得分总和。
如何更改上述查询,以便可以遍历所有 10 场比赛(或任意 X 场比赛,也许 X 等于 100)并显示结果,以便行标题是学生姓名,列标题是游戏名称,并且单元格包含学生在特定游戏中的得分总和(这可以是负数或正数)。
我使用的是 SQL Server 2008 R2。
【问题讨论】:
-
您需要在查询中添加
[GAME],然后您需要在结果中添加PIVOT。这里有大量关于旋转的信息。或者你可以让你的表现层为你做这件事。 -
当您说我需要在查询中添加 [GAME] 时,您能告诉我您的意思吗?我目前在查询中定义了 [GAME],但我不知道如何遍历所有 10 场比赛或任意 X 场比赛(其中 X 可以等于 100)。
-
以
SELECT GAME,STUDENT,SUM(SCORE) from ... GROUP BY GAME,STUDENT开头。这将为您提供您正在寻找的内容。如果您想查询游戏的子集,只需将它们添加到您的 where 子句中即可。
标签: sql sql-server sql-server-2008 sql-server-2008-r2