繁体   English   中英

如何为每场比赛返回一个新列

[英]How do I return a new column for every match

我有以下格式的表格:

参考 其他参考
水果 苹果
水果 香蕉
水果 柠檬
蔬菜 萝卜
蔬菜 土豆

我想要做的是把它弄平,所以它看起来像下面这样:

参考 其他参考 其他参考B 其他参考文献
水果 苹果 香蕉 柠檬
蔬菜 萝卜 土豆

由于附加列的动态特性,我遇到了麻烦,因为与Ref相关的OtherRef的数量会有所不同。

任何人都可以建议我如何实现这一目标? 我正在使用 SQL 服务器 2014。

一个可能的解决方案是动态语句(......列名略有不同):

-- Dynamic columns  
DECLARE @stmt nvarchar(max)
SELECT @stmt = STUFF(
   (
   SELECT CONCAT(N', OtherRef', RN)
   FROM (
      SELECT DISTINCT ROW_NUMBER() OVER (PARTITION BY Ref ORDER BY OtherRef) AS RN
      FROM Data
   ) t
   FOR XML PATH(''), TYPE
   ).value('.', 'NVARCHAR(MAX)'),
   1, 2, N''
)  
  
-- Dynamic statement 
SET @stmt = 
   N'SELECT * ' +
   N'FROM ( ' +  
   N'   SELECT ' + 
   N'      Ref, ' + 
   N'      OtherRef, ' + 
   N'      CONCAT(''OtherRef'', ROW_NUMBER() OVER (PARTITION BY Ref ORDER BY OtherRef)) AS PivotColumn ' +
   N'   FROM Data ' +
   N') t ' +
   N'PIVOT ( ' +
   N'   MAX(OtherRef) FOR PivotColumn IN (' + @stmt + N') ' +
   N') p '

-- Execution
DECLARE @err int
EXEC @err = sp_executesql @stmt
IF @err <> 0 PRINT 'Error';

结果:

-------------------------------------------------
| Ref       | OtherRef1 | OtherRef2 | OtherRef3 |
-------------------------------------------------
| Fruit     | Apple     | Banana    | Lemon     |
| Vegetable | Carrot    | Potato    |           |
-------------------------------------------------

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM