Sql server 如何使用自定义列名在一行中连接多行

Sql server 如何使用自定义列名在一行中连接多行,sql-server,tsql,sql-server-2016,Sql Server,Tsql,Sql Server 2016,我正在做一个石头、布、剪刀的游戏,我有一张桌子来保存回合结果,但我在每一轮中为每个玩家保存一行,所以如果有N个玩家,他们也会在每一轮中保存N行 我想要的是显示一个关于各轮进展情况的报告,但我不想每轮显示N行,我想显示一个单独的报告,其中N列显示玩家数据,最后一列显示获胜者的姓名 目前,这是我正在生成的报告: | Round | Player | Shape | Won | |-------|-------------------|----------|-----| |

我正在做一个石头、布、剪刀的游戏,我有一张桌子来保存回合结果,但我在每一轮中为每个玩家保存一行,所以如果有N个玩家,他们也会在每一轮中保存N行

我想要的是显示一个关于各轮进展情况的报告,但我不想每轮显示N行,我想显示一个单独的报告,其中N列显示玩家数据,最后一列显示获胜者的姓名

目前,这是我正在生成的报告:

| 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) |
+-------+-------------+-------------+--------------+--------------+-------------------+