使用可能的组合将行转换为列
Posted
技术标签:
【中文标题】使用可能的组合将行转换为列【英文标题】:Convert rows to column with possible combinations 【发布时间】:2018-06-01 23:10:41 【问题描述】:我需要将一个查询结果转换为具有可能组合的表。详情请看以下:
这是我的原始结果,由选择查询返回(字段最多可以是 n 个数字)。
我想要这样的输出:
我尝试过 Pivot,但对我来说似乎不起作用,我在 C# 代码上应用了逻辑,生成相同的结果,但生成结果需要时间。任何人都知道我如何在 SQL Server 上做到这一点?
非常感谢。
【问题讨论】:
您的输出对我来说没有多大意义。您将 5 行变成了 4 行,并且列是随机的。你能解释一下这里的逻辑吗? 【参考方案1】:with #all as
(select * from YourTable)
select * from (select ID,
,case when FieldName ='FIELD_1356 ' then 'FIELD_1356'
when FieldName ='FIELD_1359' then 'FIELD_1359'
when FieldName ='FIELD_1362' then 'FIELD_1362'
end as seqno
from #all
) as datatable
pivot(
Max([FIELDVALUE])
for [seqno] in ([FIELD_1356],[FIELD_1359],[FIELD_1362])
)as piv
为 Pivot 试试这个。它可能会给你你正在寻找的东西。
【讨论】:
【参考方案2】:以下内容适用于您的示例:
SELECT DISTINCT
T.ID
, FIELD_1356.FIELD_1356
, FIELD_1359.FIELD_1359
, FIELD_1362.FIELD_1362
FROM
YourTable T
OUTER APPLY (SELECT FieldValue FIELD_1356 FROM YourTable WHERE ID = T.ID AND FieldName = 'FIELD_1356') FIELD_1356
OUTER APPLY (SELECT FieldValue FIELD_1359 FROM YourTable WHERE ID = T.ID AND FieldName = 'FIELD_1359') FIELD_1359
OUTER APPLY (SELECT FieldValue FIELD_1362 FROM YourTable WHERE ID = T.ID AND FieldName = 'FIELD_1362') FIELD_1362
对于未知数量的 ID 和字段的动态 SQL 解决方案,您可以使用:
DECLARE @Fields table (FieldName varchar(255))
INSERT INTO @Fields
SELECT DISTINCT FieldName FROM YourTable
DECLARE
@SelectSection varchar(max) = ''
, @ApplySection varchar(max) = ''
SELECT @SelectSection = @SelectSection + ', ' + FieldName + '.' + FieldName
FROM @Fields
ORDER BY FieldName
SELECT @ApplySection = @ApplySection + ' ' + 'OUTER APPLY (SELECT FieldValue ' + FieldName + ' FROM YourTable WHERE ID = T.ID AND FieldName = ''' + FieldName + ''') ' + FieldName
FROM @Fields
ORDER BY FieldName
DECLARE @SQL varchar(max) = 'SELECT DISTINCT T.ID' + @SelectSection + ' FROM YourTable T' + @ApplySection
EXEC (@SQL)
【讨论】:
非常感谢。您的动态 SQL 解决方案对我来说非常有效....:)以上是关于使用可能的组合将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章