我试图让我的列作为值返回,并根据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中提取信息并进行操作,但是我自己却无法解决该问题。
答案 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
答案 1 :(得分:1)
一种方法是将CROSS APPLY
与VALUES()
一起使用。您也可以使用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