区域 指标1 指标2 指标3 年度 月度
一环 100 200 300 2011 8
一环 100 200 300 2010 8
二环 100 200 300 2011 8
二环 100 200 300 2010 8
三环 100 200 300 2011 8
三环 100 200 300 2010 8
要把以上表格转化成下面这个样子
区域 指标名称 2011-8(当前月) 2010-8(去年同期)
一环 指标1 100 100
一环 指标2 200 200
一环 指标3 300 300
二环 指标1 100 100
二环 指标2 200 200
二环 指标3 300 300
三环 指标1 100 100
三环 指标2 200 200
三环 指标3 300 300
首先是部分的行列转换,然后把库中的年度、月度接起来当列名使用
SQL 不是很会用,尝试了一下,没出来,请教各位大神
用oracle 怎样实现?谢谢了
5 个解决方案
#1
字段什么数据类型
#2
假设都是varchar
区域 area
指标1 p1
指标2 p2
指标3 p3
年度 year
月度 mon
指标名称 pname
表 tab1
with temptab as(
select area,p1 p,'指标1' as pname,year,mon from tab1
union
select area,p2 p,'指标2' as pname,year,mon from tab1
union
select area,p3 p,'指标3' as pname,year,mon from tab1
)
select area,pname,t1.p,t2.p
from temptab t1,temptab t2
where t1.area=t2.area
and t1.pname = t2.pname
and t1.mon = t2.mon
and t1.year='2011' and t2.year='2010' ;
本地无环境,没测过。如有问题,请指正。
区域 area
指标1 p1
指标2 p2
指标3 p3
年度 year
月度 mon
指标名称 pname
表 tab1
with temptab as(
select area,p1 p,'指标1' as pname,year,mon from tab1
union
select area,p2 p,'指标2' as pname,year,mon from tab1
union
select area,p3 p,'指标3' as pname,year,mon from tab1
)
select area,pname,t1.p,t2.p
from temptab t1,temptab t2
where t1.area=t2.area
and t1.pname = t2.pname
and t1.mon = t2.mon
and t1.year='2011' and t2.year='2010' ;
本地无环境,没测过。如有问题,请指正。
#3
SQL> WITH t AS (
2 SELECT '一环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
3 SELECT '一环' area,101 p1,201 p2,301 p3,2010 tyear,8 mon FROM dual UNION ALL
4 SELECT '二环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
5 SELECT '二环' area,102 p1,202 p2,302 p3,2010 tyear,8 mon FROM dual UNION ALL
6 SELECT '三环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
7 SELECT '三环' area,103 p1,203 p2,303 p3,2010 tyear,8 mon FROM dual
8 )
9 SELECT m.area,
10 m.pname,
11 MAX(decode(m.tyear,2011,m.p,NULL)) 当前月,
12 MAX(decode(m.tyear,2010,m.p,NULL)) 去年同期
13 FROM (
14 SELECT t.area,'指标1' pname,t.p1 p,t.tyear,t.mon FROM t UNION ALL
15 SELECT t.area,'指标2' pname,t.p2 p,t.tyear,t.mon FROM t UNION ALL
16 SELECT t.area,'指标3' pname,t.p3 p,t.tyear,t.mon FROM t
17 ) m
18 GROUP BY m.area,m.pname
19 ORDER BY m.area,m.pname
20 ;
AREA PNAME 当前月 去年同期
------ ------- ---------- ----------
一环 指标1 100 101
一环 指标2 200 201
一环 指标3 300 301
三环 指标1 100 103
三环 指标2 200 203
三环 指标3 300 303
二环 指标1 100 102
二环 指标2 200 202
二环 指标3 300 302
排序有点问题,因为是按照area的汉字排序,最好是按照区域的ID排序
#4
oracle的聚合函数,有专列功能吧。记不清了,自己查查。
#5
最近有事没上 我写了一个 比你的麻烦些..
谢谢指点了。
我也发现这个汉子排序问题了,很无奈。
#1
字段什么数据类型
#2
假设都是varchar
区域 area
指标1 p1
指标2 p2
指标3 p3
年度 year
月度 mon
指标名称 pname
表 tab1
with temptab as(
select area,p1 p,'指标1' as pname,year,mon from tab1
union
select area,p2 p,'指标2' as pname,year,mon from tab1
union
select area,p3 p,'指标3' as pname,year,mon from tab1
)
select area,pname,t1.p,t2.p
from temptab t1,temptab t2
where t1.area=t2.area
and t1.pname = t2.pname
and t1.mon = t2.mon
and t1.year='2011' and t2.year='2010' ;
本地无环境,没测过。如有问题,请指正。
区域 area
指标1 p1
指标2 p2
指标3 p3
年度 year
月度 mon
指标名称 pname
表 tab1
with temptab as(
select area,p1 p,'指标1' as pname,year,mon from tab1
union
select area,p2 p,'指标2' as pname,year,mon from tab1
union
select area,p3 p,'指标3' as pname,year,mon from tab1
)
select area,pname,t1.p,t2.p
from temptab t1,temptab t2
where t1.area=t2.area
and t1.pname = t2.pname
and t1.mon = t2.mon
and t1.year='2011' and t2.year='2010' ;
本地无环境,没测过。如有问题,请指正。
#3
SQL> WITH t AS (
2 SELECT '一环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
3 SELECT '一环' area,101 p1,201 p2,301 p3,2010 tyear,8 mon FROM dual UNION ALL
4 SELECT '二环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
5 SELECT '二环' area,102 p1,202 p2,302 p3,2010 tyear,8 mon FROM dual UNION ALL
6 SELECT '三环' area,100 p1,200 p2,300 p3,2011 tyear,8 mon FROM dual UNION ALL
7 SELECT '三环' area,103 p1,203 p2,303 p3,2010 tyear,8 mon FROM dual
8 )
9 SELECT m.area,
10 m.pname,
11 MAX(decode(m.tyear,2011,m.p,NULL)) 当前月,
12 MAX(decode(m.tyear,2010,m.p,NULL)) 去年同期
13 FROM (
14 SELECT t.area,'指标1' pname,t.p1 p,t.tyear,t.mon FROM t UNION ALL
15 SELECT t.area,'指标2' pname,t.p2 p,t.tyear,t.mon FROM t UNION ALL
16 SELECT t.area,'指标3' pname,t.p3 p,t.tyear,t.mon FROM t
17 ) m
18 GROUP BY m.area,m.pname
19 ORDER BY m.area,m.pname
20 ;
AREA PNAME 当前月 去年同期
------ ------- ---------- ----------
一环 指标1 100 101
一环 指标2 200 201
一环 指标3 300 301
三环 指标1 100 103
三环 指标2 200 203
三环 指标3 300 303
二环 指标1 100 102
二环 指标2 200 202
二环 指标3 300 302
排序有点问题,因为是按照area的汉字排序,最好是按照区域的ID排序
#4
oracle的聚合函数,有专列功能吧。记不清了,自己查查。
#5
最近有事没上 我写了一个 比你的麻烦些..
谢谢指点了。
我也发现这个汉子排序问题了,很无奈。