我可以将所有列返回为行,并将它们的值返回第二列吗?

时间:2019-07-12 05:03:39

标签: sql sql-server

我正在尝试创建一些用于审核的报告,但是我有一个非常具体的问题。

大约有120列,每列都有一个特定的数字答案。我想返回列名和该列的行值。我知道我会得到很多结果,但这不是问题。

例如,我有:

1    |ColumnA | Value A
2    |ColumnA | Value A2
1    |ColumnB | Value B
2    |ColumnB | Value B2

但是我想要的是:

{{1}}

我尝试返回所有行,然后自行加入,但是并没有为我提供所需的输出。

3 个答案:

答案 0 :(得分:1)

简单的unpivot就可以了:)

declare @tbl table ([Key] int, ColumnA varchar(15), ColumnB varchar(15));
insert into @tbl values
(1, 'Value A', 'ValueB'),
(2, 'ValueA2', 'ValueB2');

select [key], [column], [value] from
(select * from @tbl) p
unpivot 
([value] for [column] in (ColumnA, ColumnB)) u
order by [column]

答案 1 :(得分:0)

以下查询应执行所需的操作-您需要对列名称进行自定义排序:

foreach

结果如下,

CREATE TABLE #temp (ColumnA VARCHAR(20), ColumnB VARCHAR(20))

INSERT INTO #temp VALUES ('Value A','Value B'),('Value A2','Value B2')

SELECT t.Col, t.Val
FROM (SELECT *,ROW_NUMBER() OVER (ORDER BY (SELECT 1)) RNO FROM #temp t) tmp
CROSS APPLY (VALUES (tmp.ColumnA,'ColumnA',tmp.RNO),(tmp.ColumnB,'ColumnB',tmp.RNO)) AS T(Val,Col,sort)
ORDER BY T.Col, Sort

答案 2 :(得分:0)

非常简单...如果您知道列名,则可以使用简单的UNION

SELECT * FROM tblAuditing


SELECT 'ColumnA' AS ColumnA,'ColumnB' AS ColumnA UNION
SELECT ColumnA AS ColumnA,ColumnB AS ColumnA FROM tblAuditing

enter image description here