我可以返回一列的值为两列的列吗?

时间:2019-08-08 07:32:18

标签: sql-server

我试图让我的列作为值返回,并根据ID对该行的答案进行返回。我有一个带有约80 ish列的表,我需要返回该列的名称及其值,即 关键是,我需要动态执行此操作,因为我需要多个表。

现状

RowID|Col a | col b | col c | col d
----------------------------
1    |val a | val b | val c | val d|


Output situation:

Return: 
Column Name | Value | 
col a       | val a |
col b       | val b |
col c       | val c |
col d       | val d |
Where RowID = 1

我已经尝试从information_schema.columns中提取信息并进行操作,但是我自己却无法解决该问题。

3 个答案:

答案 0 :(得分:2)

您可以按以下方式使用UNPIVOT

SELECT RowId, Col, Val  
FROM   
   (SELECT RowID, ColA, ColB, ColC, ColD  
   FROM tbl) p  
UNPIVOT  
   (Val FOR Col IN   
      (ColA, ColB, ColC, ColD )  
)AS unpvt

实时示例:http://sqlfiddle.com/#!18/619d8/2/0

答案 1 :(得分:1)

一种方法是将CROSS APPLYVALUES()一起使用。您也可以使用UNPIVOT()UNION ALL

select  RowID, [Column Name], [Value]
from    yourtable
        cross apply
        (
            values 
            ('Col a', [Col a]),
            ('Col b', [Col b]),
            ('Col c', [Col c]),
            ('Col d', [Col d])
        ) v ([Column Name], [Value])

答案 2 :(得分:1)

您可以使用它。由于您有许多列,因此必须使用动态sql,并且unpivot用于将您的列转换为行。有关unpivot的更多信息,您可以找到此link

----- yourtable and Id_col name will be pass dynamically to reuse this query for multiple columns.
DECLARE @COL NVARCHAR(MAX)
SET @COL = ( SELECT 
              STUFF( (SELECT ',[' + COLUMN_NAME + ']' FROM INFORMATION_SCHEMA.COLUMNS 
                -----  here ID_Col will be replaced by set of columns need to excluded from your final output table.
                 WHERE TABLE_NAME = 'YOURTABLE' AND COLUMN_NAME<>'ID_COL' FOR XML PATH('')   
                   ),1,1,'')  )

DECLARE @QUERY NVARCHAR(MAX) 
SET @QUERY = 'SELECT ID_COL, Col, Val  
FROM   
   (SELECT ID_COL, ' + @COL + ' FROM YOURTABLE ) D
UNPIVOT  
   (Val FOR Col IN (' + @COL + ' )  
) AS unpvt'

EXEC SP_EXECUTESQL @QUERY