2015-05-18 28 views
0

表结构如何让SQL Server中的期望输出2008

EID COLA COLB 
1 name A 
1 age 23 
1 city hyd 
1 email [email protected] 
1 mobile 45126 
2 name B 
2 age 43 
2 city bang 
3 name C 
3 age 13 
3 city bang 
3 email [email protected] 

我想有输出如下

ID||COLA||COLB 
    1||name||A 
    1||age||23 
    1||city||hyd 
    1||email||[email protected] 
    1||mobile||45126 
    2||name||B 
    2||age||43 
    2||city||bang 
    2||email||NULL 
    2||mobile||NULL 
    3||name||C 
    3||age||13 
    3||city||bang 
    3||email||[email protected] 
    3||mobile||NULL 

你能请让我知道如何做到这一点输出。 如何显示任何必填字段(名称,年龄,城市,电子邮件,移动)缺失的结果,那么它应显示为该字段为空,在我们通过过滤单个id在where子句中提供的查询中价值和可乐为(姓名,年龄,城市,电子邮件,手机)

我查询:

select 

case colA 

when cola then colA+'||'+colB 

end 

from tbl 

where cola in ('name','age','city','email','mobile') 

回答

0

让我说,你问什么会是真的很容易,如果你的表结构开始曾要求列如name,age,city等名称值对不是这样的表的好设计,更不用说严重性能问题将困扰这种结构的任何解决方案。

话虽如此,您可以使用PIVOT/UNPIVOT或属性表(一个包含所需属性列表的表)和GROUP BYCROSS JOIN

样本数据使用PIVOT/UNPIVOT

SELECT EID, COLA,NULLIF(COLB,'') COLB 
FROM 
(
SELECT EID,ISNULL([name],'') name,ISNULL([age],'') [age],ISNULL([city],'') [city],ISNULL([email],'') [email],ISNULL([mobile],'') [mobile] 
FROM (SELECT EID,COLA,COLB 
FROM @table1) T 
PIVOT (MAX(COLB) FOR COLA IN ([name],[age],[city],[email],[mobile])) AS pvt 
) tbl 
UNPIVOT (COLB FOR ColA IN (name,age,city,email,mobile)) AS Upvt 

请注意,我用的ISNULL(col,'')因为UNPIVOT排除NULL

DECLARE @table1 TABLE(
EID INT, COLA VARCHAR(30), COLB VARCHAR(30)) 

INSERT INTO @table1 VALUES 
(1,'name','A'), 
(1,'age','23'), 
(1,'city','hyd'), 
(1,'email','[email protected]'), 
(1,'mobile','45126'), 
(2,'name','B'), 
(2,'age','43'), 
(2,'city','bang'), 
(3,'name','C'), 
(3,'age','13'), 
(3,'city','bang'), 
(3,'email','[email protected]'); 

查询。如果''对您而言是有效值,则可以使用另一个字符串表示NULL或使用GROUP BY解决方案。

查询使用属性表和GROUP BYCROSS JOIN

;WITH Cols(Name) AS 
(
SELECT 'name' UNION ALL SELECT 'age' UNION ALL SELECT 'city' UNION ALL SELECT 'email' UNION ALL SELECT 'mobile' 
) 

SELECT t.EID,C.Name,t1.COLB 
FROM 
(
SELECT EID 
FROM @table1 
GROUP BY EID 
) t 
CROSS JOIN Cols c 
LEFT JOIN @table1 t1 ON t1.EID = t.EID and t1.COLA = C.Name 
0
CREATE TABLE DesireOutput(EID nvarchar(10),COLA NVARCHAR(10),COLB nvarchar(50)) 

INSERT INTO DesireOutput VALUES( '1', '姓名', 'A')

INSERT INTO DesireOutput VALUES('1','age','23')

INSERT INTO DesireO utput VALUES('1','city','hyd')

INSERT INTO DesireOutput VALUES('1','email','abc @ live。IN ')

INSERT INTO DesireOutput VALUES(' 1' , '移动', '45126')

INSERT INTO DesireOutput VALUES( '2', '姓名', 'B')

INSERT INTO DesireOutput VALUES( '2', '年龄', '43')

INSERT INTO DesireOutput VALUES( '2', '城市', '砰')

INSERT INTO DesireOutput VALUES( '3', 'name','C')

INSERT IN TO DesireOutput VALUES( '3', '年龄', '13')

INSERT INTO DesireOutput VALUES( '3', '城市', '砰')

INSERT INTO DesireOutput VALUES( '3', 'email','[email protected]')

DECLARE @t AS TABLE (ColA NVARCHAR(50)) 

INSERT INTO @t 
     SELECT DISTINCT 
       D.COLA 
     FROM DesireOutput D 



SELECT t.EID ,   c.ColA ,   t1.COLB FROM (SELECT 
EID   FROM  DesireOutput   GROUP BY EID 
     ) t 
     CROSS JOIN @t c 
     LEFT JOIN DesireOutput t1 ON t1.EID = t.EID 
             AND t1.COLA = c.ColA ORDER BY EID 
相关问题