使用可能的组合将行转换为列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用可能的组合将行转换为列相关的知识,希望对你有一定的参考价值。

我需要将一个查询结果转换为具有可能组合的表。请看详情如下:

这是我的原始结果,由select查询返回(字段最多可以是n个数字)。 enter image description here

我想要这样的输出:

I want output like this:

我尝试过Pivot,但似乎对我不起作用,我在C#代码上应用了逻辑,它生成相同的结果,但是花费时间来生成结果。任何人都知道如何在SQL Server上执行此操作?

非常感谢你。

答案

以下内容适用于您的示例:

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)
另一答案
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。它可能会给你你想要的东西。

以上是关于使用可能的组合将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

将行值转换为列,并计算所有可能值 mysql 的重复次数

MS Access SQL 将行转换为列

使用R将行转换为列,将列转换为行

将行转换为列

使用枢轴将行转换为列

如何使用 Postgresql 将行转换为列?