2017-09-15 57 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