SQL如何将行转换为列,将列转换为行?db2
我有一个SQL查询,它在DB2中运行良好 我的结果是SQL如何将行转换为列,将列转换为行?db2,sql,db2,rows,Sql,Db2,Rows,我有一个SQL查询,它在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 INPROGRES
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'
你要找的词是“支点” 如果您的DBMS不提供,您可以使用“穷人的轴心” 看看usr对这个问题的回答:
作为备注,您的结果应该是:
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'
哪些RBDM(SQL Server、Oracle、Mysql等)?对于大多数人来说,这个问题有很多重复之处。据我所知,没有一个DB2 Pivot等价物,我建议采用下面Ben回答中链接中建议的方法。@Dejan看看这个链接,它提供了一种不使用
Pivot
的方法。他在你澄清你使用的是哪种RBDM之前发布了;-)@Dejan,不是我上次检查的,但最新版本可能是。