2017-09-15 87 views
1

我有一個已經存在的表(所以我不能改變這個表)是這樣的:SQL樞軸還是別的?

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函數,但沒有看到根據需要創建臨時表的方法。

回答

0

使用cross apply(values ..)到逆轉置數據:

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

rextester演示: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 | 
+-------+-------+ 
0

使用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