可以用wm_concat函数先把数据变成行显示,然后再通过截取来显示具体的月份,wm_concat转换如下
你所需要的网站建设服务,我们均能行业靠前的水平为你提供.标准是产品质量的保证,主要从事网站设计、成都网站建设、企业网站建设、移动网站建设、网页设计、品牌网站建设、网页制作、做网站、建网站。创新互联拥有实力坚强的技术研发团队及素养的视觉设计专才。
select compay_name cn, wm_concat(income) ic
from (select compay_name, sum(income) income, substr(time, 1, 6) time
from income
---where time =start_month and time = end_month
group by compay_name, substr(time, 1, 6)
order by compay_name, substr(time, 1, 6))
group by compay_name;
可用union all来实现。
如test表中数据如下:
现要将id为3的一条按列显示,可用如下语句:
select to_char(id) str from test where id=3
union all
select name from test where id=3;
查询结果:
行转列的准则就是通过主键进行分组,之后对行其它字段加上sum()、max()、count()函数,里边用decode()这类函数进行处理,总之分组不要用到他就成。
测试表测了下,可以用,你看看,主要是先根据逗号进行分割,然后connect,level等于逗号的数目:
select id,nvl(substr(glbh,instr(glbh,',',1,lvl)+1,instr(glbh,',',1,lvl+1)-instr(glbh,',',1,lvl)-1),'kong') glbh
from (
select id,lvl,','||glbh||',' glbh
from test a ,
(select level lvl from dual connect by level=
(select max(length(glbh)-length(replace(glbh,',')))+1 from test)) b
) t1
where substr(glbh,instr(glbh,',',1,lvl)+1,instr(glbh,',',1,lvl+1)-instr(glbh,',',1,lvl)-1) is not null
order by id,glbh;
姓名 数学 语文 姓名 张飞 赵云 庞统
张飞 60 61 数学 60 80 99
赵云 80 85 变成 语文 61 85 80
庞统 99 80
而且第一行为列名,不是表中的数据,这样的话
也就是第一个表下面三行的数据,变成第二个表下面两行的数据
这样还是可以的