Reputation: 1808
I have an SQL query which works fine in DB2 My result is
SERVICE IN OUT INPROGRESS
ADSL 1 5 10
VOIP 15 12 11
IPTV 20 14 17
Now I want to transform it to be like this:
CLASS ADSL VOIP IPTV
IN 1 5 10
OUT 15 12 11
INPROGRESS 20 14 17
Although it seems long my SQL is very simple but I never had transformed this. If someone knows I will be thankful.
My SQL is
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'
Upvotes: 0
Views: 11563
Reputation: 7957
Just as a remark, your result should like:
CLASS ADSL VOIP IPTV
IN 1 15 20
OUT 5 12 14
INPROGRESS 10 11 17
The pivoted version should be something like:
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'
Upvotes: 1
Reputation: 35613
The word you are looking for is "PIVOT".
If your DBMS doesn't offer one, you can use the "poor man's pivot".
Look at usr's answer on this question:
Poor Man's SQL Pivot. List Questions as Columns and Answers per User in one row
Upvotes: 0