получить положение столбца, в котором существует значение при отмене поворота таблицы в SQL - PullRequest
0 голосов
/ 24 января 2019

Я пытаюсь получить позицию столбца значения при выполнении откручивания для столбцов col2, col3, col4 на сервере SQL

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

Ответы [ 4 ]

0 голосов
/ 24 января 2019

Вы можете использовать APPLY:

SELECT df1.col1, dff.*     
FROM df1 as df CROSS APPLY
     ( VALUES (col2, 1), (col3, 2), (col4, 3) ) dff([All], [Position])
WHERE dff.[All] IS NOT NULL;
0 голосов
/ 24 января 2019

Попробуйте это

select * from (

select col1,1 as position , col2  as [All] from [Table] 
Union
select col1,2 as position, col3  as [All] from [Table] 
Union
select col1,3 as position, col4  as [All] from [Table] )
where [all] is not null;


0 голосов
/ 24 января 2019

если вам просто нужно знать, из какого он столбца, я думаю, вы можете просто включить 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;

, если вам нужно знать индексный номер столбца - тогда это должно бытьлегко на основании вышеизложенного - возможно, сделайте проверку переключателя для имени столбца;или

, если это физическая или временная таблица, вы можете объединиться с sys.tables и sys.columns, чтобы найти индекс столбца (columnId) на основе имени столбца.

0 голосов
/ 24 января 2019

Вы можете попробовать ниже - используя row_number()

SELECT a.col1, a.[all],row_number() over(partition by a.col1 order by a.[all]) as position
from df1 as t
UNPIVOT
(
[all] for col_nm in (
    col2, col3, col4
) as a
...