2012-06-01 63 views
0

我有一個SQL查詢這在DB2工作正常 我的結果是SQL如何將ROWS轉換爲COLUMNS和COLUMNS TO ROWS? DB2

SERVICE IN OUT INPROGRESS 

ADSL  1  5  10 
VOIP  15 12  11 
IPTV  20 14  17 

現在我想改變它是這樣的:

CLASS  ADSL VOIP IPTV 

IN   1  5  10 
OUT   15 12  11 
INPROGRESS 20 14  17 

雖然看起來長我的SQL是非常簡單但我從來沒有改變過這一點。如果有人知道我會感激。

我的SQL是

select distinct 'ADSL' as SERVICE, 

(select count(*) as In from ticket 
where 
(class='C1' and 
(servicesinfault='25'))), 

(select count(*) as Out from ticket 
where 
(class='C2' and 
(servicesinfault='25'))), 


(select count(*) as In_progress from ticket 
where 
(class='C3' and 
(servicesinfault='25'))) 

from ticket where servicesinfault = '25' 

union all 

select distinct 'VoIP', 

(select count(*) from ticket 
where 
(class='C1' and 
(servicesinfault='26'))), 

(select count(*) from ticket 
where 
(class='C2' and 
(servicesinfault='26'))), 


(select count(*) from ticket 
where 
(class='C3' and 
(servicesinfault='26'))) 

from ticket where servicesinfault = '26' 

union all 

select distinct 'IPTV', 

(select count(*) from ticket 

where 
(class='C1' and 
(ticket.servicesinfault='27'))), 

(select count(*) from ticket 
where 
(class='C2' and 
(servicesinfault='27'))), 

(select count(*) from ticket 
where 
(class='C3' and 
(servicesinfault='27'))) 

from ticket where servicesinfault = '27' 
+1

哪個RBDMS(SQL-Server,Oracle,Mysql等)?對於大多數人來說,這個問題有很多重複。 – Bridge

+0

我正在使用IBM DB2 – Dejan

+0

我不知道DB2 Pivot等價物,我建議採用下面Ben的答案中的鏈接建議的方法。 – Bridge

回答

1

正如此言,你的結果應該想:

CLASS  ADSL VOIP IPTV 

IN   1  15  20 
OUT   5  12  14 
INPROGRESS 10 11  17 

的擺動版本應該是這樣的:

select distinct 'In' as CLASS, 

       (select count(*) as 'ADSL' 
        from ticket 
        where (class = 'C1' and (servicesinfault = '25'))), 

       (select count(*) as 'VoIP' 
        from ticket 
        where (class = 'C1' and (servicesinfault = '26'))), 

       (select count(*) as 'IPTV' 
        from ticket 
        where (class = 'C1' and (servicesinfault = '27'))) 

    from ticket 
where class = 'C1' 

union all 

select distinct 'Out', 

       (select count(*) 
        from ticket 
        where (class = 'C2' and (servicesinfault = '25'))), 

       (select count(*) 
        from ticket 
        where (class = 'C2' and (servicesinfault = '26'))), 

       (select count(*) 
        from ticket 
        where (class = 'C2' and (servicesinfault = '27'))) 

    from ticket 
where class = 'C2' 

union all 

select distinct 'InProgress', 

       (select count(*) 
        from ticket 

        where (class = 'C3' and (ticket.servicesinfault = '25'))), 

       (select count(*) 
        from ticket 
        where (class = 'C3' and (servicesinfault = '26'))), 

       (select count(*) 
        from ticket 
        where (class = 'C3' and (servicesinfault = '27'))) 

    from ticket 
where class = 'C3' 
+0

是的,這是我想要的結果形式 – Dejan

+0

謝謝你解決的關鍵! – Dejan

0

您正在查找的詞是 「PIVOT」。

如果您的DBMS不提供一個,您可以使用「窮人的支點」。

看USR關於這個問題的答案:

Poor Man's SQL Pivot. List Questions as Columns and Answers per User in one row

+0

DB2是否提供PIVOT? – Dejan

+1

@Dejan看看不使用'PIVOT'提供方法的鏈接。他在你澄清你正在使用的RBDMS之前發佈了它;-) – Bridge

+1

@Dejan,而不是最後一次檢查,但最新版本可能。 – Ben

相關問題