SQL Pivot или что-то еще?

У меня есть уже существующая таблица (поэтому я не могу изменить эту таблицу), например:

Company     GLSeg1     GLSeg2     GLSeg3
XXX         00003      NULL       00001
YYY         00002      00004      NULL

Я хотел бы создать временную таблицу, подобную этой, выбирая только для одной компании:

При запросе XXX таблица должна выглядеть следующим образом:

GLSeg       Value
1           00003
2           NULL
3           00001

При запросе YYY таблица должна выглядеть следующим образом:

GLSeg       Value
1           00002
2           00004
3           NULL

Я посмотрел на pivot функция, но я не вижу способ создать временную таблицу по мере необходимости.

2 ответа

Решение

С помощью cross apply(values ..) чтобы отключить ваши данные:

select t.Company, v.GLSeg, v.Value
from t
  cross apply (values 
    (1,glseg1),(2,glseg2),(3,glseg3)
  ) v (GLSeg,Value)

демонстрационный ролик: http://rextester.com/ZKTD58113

возвращает:

+---------+-------+-------+
| Company | GLSeg | Value |
+---------+-------+-------+
| xxx     |     1 | 00003 |
| xxx     |     2 | NULL  |
| xxx     |     3 | 00001 |
| yyy     |     1 | 00002 |
| yyy     |     2 | 00004 |
| yyy     |     3 | NULL  |
+---------+-------+-------+

Только для одной компании:

select v.GLSeg, v.Value
from t
  cross apply (values 
    (1,glseg1),(2,glseg2),(3,glseg3)
  ) v (GLSeg,Value)  
where t.company = 'xxx'

возвращает:

+-------+-------+
| GLSeg | Value |
+-------+-------+
|     1 | 00003 |
|     2 | NULL  |
|     3 | 00001 |
+-------+-------+

Использование UNPIVOT с COALESCE:

  SELECT COMPANY
       , STUFF(SUBJECT,1,5,'') AS GLSEG
       , CASE WHEN VALUE ='<NULL>' THEN NULL ELSE VALUE END AS VALUE
  FROM  (SELECT COMPANY
                 , COALESCE( GLSEG1,'<NULL>') AS GLSEG1
                 , COALESCE( GLSEG2,'<NULL>') AS GLSEG2
                 , COALESCE( GLSEG3,'<NULL>') AS GLSEG3
         FROM SEG_COMP ) A
  UNPIVOT(VALUE FOR SUBJECT IN (GLSEG1, GLSEG2,GLSEG3) ) U
  WHERE COMPANY='XXX' 

Выход:

COMPANY GLSEG   VALUE
XXX     1       00003
XXX     2       NULL
XXX     3       00001
Другие вопросы по тегам