2015-05-18 38 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 
相關問題