首页 > 解决方案 > 在 SQL 中反透视表时获取值存在的列的位置

问题描述

我试图在 SQL Server 中对 col2、col3、col4 列进行反透视时获取值的列位置

df1
col1     col2     col3     col4     
1        AAA      BBB
2        ABC      CCC      DDD

result
col1     [All]     [position]
1        AAA        1
1        BBB        2
2        ABC        1
2        CCC        2
2        DDD        3

我可以通过使用以下内容来取消透视表

SELECT a.col1, a.[all]
from df1 as t
UNPIVOT
(
[all] for col_nm in (
    col2, col3, col4
) as a

标签: sqlsql-servertsqlunpivot

解决方案


如果您只需要知道它来自哪一列,我认为您可以简单地将 col_nm 包含到您的 select 语句中:

SELECT a.col1
      ,a.[all]
      ,a.col_nm
FROM   df1 AS t UNPIVOT([all] FOR col_nm IN(col2, col3, col4)) AS a;

如果您需要知道列索引号 - 那么根据上面应该很容易 - 也许对列名进行 switch-case 检查;或者,

如果这是物理表或临时表,您可以使用 sys.tables 和 sys.columns 重新连接,以根据列名查找列索引 (columnId)。


推荐阅读