Sql server 如何使用自定义列名在一行中连接多行
我正在做一个石头、布、剪刀的游戏,我有一张桌子来保存回合结果,但我在每一轮中为每个玩家保存一行,所以如果有N个玩家,他们也会在每一轮中保存N行 我想要的是显示一个关于各轮进展情况的报告,但我不想每轮显示N行,我想显示一个单独的报告,其中N列显示玩家数据,最后一列显示获胜者的姓名 目前,这是我正在生成的报告:Sql server 如何使用自定义列名在一行中连接多行,sql-server,tsql,sql-server-2016,Sql Server,Tsql,Sql Server 2016,我正在做一个石头、布、剪刀的游戏,我有一张桌子来保存回合结果,但我在每一轮中为每个玩家保存一行,所以如果有N个玩家,他们也会在每一轮中保存N行 我想要的是显示一个关于各轮进展情况的报告,但我不想每轮显示N行,我想显示一个单独的报告,其中N列显示玩家数据,最后一列显示获胜者的姓名 目前,这是我正在生成的报告: | Round | Player | Shape | Won | |-------|-------------------|----------|-----| |
| Round | Player | Shape | Won |
|-------|-------------------|----------|-----|
| 1 | george (Player 1) | Rock | 0 |
| 1 | wendy (Player 2) | Paper | 1 |
| 2 | george (Player 1) | Rock | 0 |
| 2 | wendy (Player 2) | Rock | 0 |
| 3 | george (Player 1) | Paper | 1 |
| 3 | wendy (Player 2) | Rock | 0 |
| 4 | george (Player 1) | Scissors | 0 |
| 4 | wendy (Player 2) | Rock | 1 |
| 5 | george (Player 1) | Scissors | 0 |
| 5 | wendy (Player 2) | Scissors | 0 |
我的预期结果如下:
| Round | Player1Name | Player2Name | Player1Shape | Player2Shape | PlayerWinner |
|-------|-------------|-------------|--------------|--------------|------------------|
| 1 | george | wendy | Paper | Rock | Wendy (Player2) |
| 2 | george | wendy | Rock | Rock | Draw (No Winner) |
| 3 | george | wendy | Paper | Rock | George (Player1) |
| 4 | george | wendy | Scissors | Rock | Wendy (Player2) |
| 5 | george | wendy | Scissors | Scissors | Draw (No Winner) |
我不知道这种报告是否可能我不是t-SQL专家,我使用的是SQL Server 2016
在这里,您可以看到一个包含3个表的模型,与实际模型非常相似,其中包含测试数据和生成第一个报告的T-SQL代码
非常感谢您使用条件聚合和一些字符串操作提供的帮助:
select
Round
, Player1Name = max(case when left(right(player,2),1)='1' then left(Player,charindex(' (',Player)) end)
, Player2Name = max(case when left(right(player,2),1)='2' then left(Player,charindex(' (',Player)) end)
, Player1Shape = max(case when left(right(player,2),1)='1' then Shape end)
, Player2Shape = max(case when left(right(player,2),1)='2' then Shape end)
, PlayerWinner = max(case when won = 1 then Player else 'Draw (NoWinner)' end)
from t
group by Round
rextester演示:
返回:
+-------+-------------+-------------+--------------+--------------+-------------------+
| Round | Player1Name | Player2Name | Player1Shape | Player2Shape | PlayerWinner |
+-------+-------------+-------------+--------------+--------------+-------------------+
| 1 | george | wendy | Rock | Paper | wendy (Player 2) |
| 2 | george | wendy | Rock | Rock | Draw (NoWinner) |
| 3 | george | wendy | Paper | Rock | george (Player 1) |
| 4 | george | wendy | Scissors | Rock | wendy (Player 2) |
| 5 | george | wendy | Scissors | Scissors | Draw (NoWinner) |
+-------+-------------+-------------+--------------+--------------+-------------------+
更新:最初不会加载sql fiddle,但一旦加载,我就将模式复制到rextester(尽管只有3轮fiddle数据): rextester演示: 返回:
+-------+-------------+-------------+--------------+--------------+-------------------+
| Round | Player1Name | Player2Name | Player1Shape | Player2Shape | PlayerWinner |
+-------+-------------+-------------+--------------+--------------+-------------------+
| 1 | george | wendy | Rock | Paper | wendy (Player 2) |
| 2 | george | wendy | Rock | Rock | Draw (NoWinner) |
| 3 | george | wendy | Paper | Rock | george (Player 1) |
+-------+-------------+-------------+--------------+--------------+-------------------+
如果您得到这样的结果,我想说的是,您的查询背后可能存在一个基本的设计问题。因此,努力改变你的模式,而不是试图修复这个输出,将为你节省长期的时间run@Tanner谢谢你的评论,正如我说的,我不是SQL/DB专家,我现在不能改变整个设计,因为很多事情都取决于它,我可以随心所欲地更改报告,因为没有依赖项,只有一个SQL查询,但更改整个模型将影响许多事情。这些设计缺陷迟早会成为解释和管理的难题,祝你好运@Tanner谢谢你的建议,但我需要解决我目前的问题,也许以后我会考虑SSMS即将开放。。你的答案是:D,做得好(y)这有点掩盖了设计中的缺陷,我想说,至少值得一提。@Tanner你在对问题的评论中已经提到了这一点,所以我觉得没有必要重复你的话。我想未来的读者可能不会读这本书comments@SqlZim谢谢你的代码,我只是想知道是否有一种方法可以根据Player表中的记录动态生成列?如果一个游戏有两个以上的玩家。。。
+-------+-------------+-------------+--------------+--------------+-------------------+
| Round | Player1Name | Player2Name | Player1Shape | Player2Shape | PlayerWinner |
+-------+-------------+-------------+--------------+--------------+-------------------+
| 1 | george | wendy | Rock | Paper | wendy (Player 2) |
| 2 | george | wendy | Rock | Rock | Draw (NoWinner) |
| 3 | george | wendy | Paper | Rock | george (Player 1) |
+-------+-------------+-------------+--------------+--------------+-------------------+