将列名称放入sql server中的行

时间:2019-02-12 13:20:50

标签: sql-server

我有一个表,其中的列column_name_1,column_name_2,column_name_3且行值分别为0,0,1

column_name_1 , column_name_2  , column_name_3
--------------,----------------,---------------
      0       ,       0        ,      1

我需要类似

的输出
column_name_1  | 0  
column_name_2  | 0  
column_name_3  | 1  

有可能吗?

我已经检查了一些明确的例子,那不完全是我的情况。

因为我需要在列值中添加列名,在列中添加一行。

1。Unpivot with column name

名称,数学,科学,英语
Tilak,90、40、60
拉吉,30,20,10

更改为

名称,主题,标记
蒂拉克(Tilak),数学,90岁
蒂拉克(Tilak),科学,40岁
蒂拉克语,英语,60

很明显有一个视图,“名称”列保持原样。

2。SQL Query for generating matrix like output querying related table in SQL Server

上面的链接中还有“客户名称”列,该列保持不变。

但是在我的情况下,输入和输出的位置都不相同。

因此,即使仍然可以通过数据透视表实现,请帮助提供代码。

2 个答案:

答案 0 :(得分:2)

很明显 UNPIVOT 会更好,但是如果您需要一种动态方法而不实际使用动态SQL

示例

Select C.*
 From YourTable A
 Cross Apply ( values (cast((Select A.* for XML RAW) as xml))) B(XMLData)
 Cross Apply (
                Select Item  = a.value('local-name(.)','varchar(100)')
                      ,Value = a.value('.','varchar(max)') 
                 From  B.XMLData.nodes('/row')  as C1(n)
                 Cross Apply C1.n.nodes('./@*') as C2(a)
                 Where a.value('local-name(.)','varchar(100)') not in ('Columns','ToExclude')
             ) C

返回

Item            Value
Column_name_1   0
column_name_2   0
column_name_3   1

答案 1 :(得分:1)

您想要APPLY

SELECT tt.cols, tt.colsvalue
FROM table t CROSS APPLY
     ( VALUES ([column_name_1], 'column_name_1'), 
              ([column_name_2], 'column_name_2'), 
              ([column_name_3], 'column_name_3') 
     ) tt (colsvalue, cols);