
[英]How do I get it to return every column in a table when using INNER JOIN on two tables,
[英]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.