查看: 3826|回复: 10

请教复杂的行列转换问题

[复制链接]
论坛徽章:
0
跳转到指定楼层
1#
发表于 2007-1-31 17:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的数据如下:
    北京东 北京东 2006-12-01 B01
    北京东 北京东 2006-12-02 B11
    北京东 杨浦    2006-12-08 D11
    杨浦    杨浦    2006-12-10 B01
    杨浦    杨浦    2006-12-11 B11
    杨浦    北京东 2006-12-15 D11
    北京东 北京东 2006-12-16 B01
    ……
要求转换成如下格式:
   北京东   北京东 2006-12-01  北京东 2006-12-02 杨浦    2006-12-08
   杨浦      杨浦    2006-12-10  杨浦    2006-12-11 北京东 2006-12-15
   ……
数据源中的第一列不只是北京东和杨浦,还有其他的地名,在每个地方有一次循环(第四列由B01到B11到D11),转换行列的时候其实是同时转换了两列,并且都不是数字型的,我试过了好多方法都不能实现我的要求,希望能够得到各位大侠的帮助!
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
2#
发表于 2007-1-31 20:53 | 只看该作者
SQL> create table test_7 (addr_from varchar2(20),addr_to varchar2(20),start_date date,no varchar2(10));

Table created

SQL> insert into test_7 values ('北京东','北京东',to_date('2006-12-01','yyyy-mm-dd'),'B01');

1 row inserted

SQL> insert into test_7 values ('北京东','北京东',to_date('2006-12-02','yyyy-mm-dd'),'B11');

1 row inserted

SQL> insert into test_7 values ('北京东','杨浦',to_date('2006-12-08','yyyy-mm-dd'),'D11');

1 row inserted

SQL> insert into test_7 values ('杨浦','杨浦',to_date('2006-12-10','yyyy-mm-dd'),'B01');

1 row inserted

SQL> insert into test_7 values ('杨浦','杨浦',to_date('2006-12-11','yyyy-mm-dd'),'B11');

1 row inserted

SQL>  insert into test_7 values ('杨浦','北京东',to_date('2006-12-15','yyyy-mm-dd'),'D11');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from test_7;

ADDR_FROM            ADDR_TO              START_DATE  NO
-------------------- -------------------- ----------- ----------
北京东               北京东               2006-12-1   B01
北京东               北京东               2006-12-2   B11
北京东               杨浦                 2006-12-8   D11
杨浦                 杨浦                 2006-12-10  B01
杨浦                 杨浦                 2006-12-11  B11
杨浦                 北京东               2006-12-15  D11

6 rows selected

SQL> select addr_from||replace(max(sys_connect_by_path(addr_to,',')),',',' ') path from (
  2  
  2  select addr_from,addr_from||(rn - no) as addr,addr_to,rn,no
  3  from (
  4  select addr_from,addr_to||' '||to_char(start_date,'yyyy-mm-dd') as addr_to,
  5  row_number() over (order by 1) as rn,decode(no,'B01',1,'B11',2,'D11',3) as no
  6  from test_7)
  7  )
  8  start with no=1
  9  connect by rn-1 = prior rn
10  group by addr_from,addr;

PATH
--------------------------------------------------------------------------------
杨浦 杨浦 2006-12-10 杨浦 2006-12-11 北京东 2006-12-15
北京东 北京东 2006-12-01 北京东 2006-12-02 杨浦 2006-12-08

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
3#
发表于 2007-1-31 21:28 | 只看该作者
当在增加记录时,上面的不能满足,改成下面的语句了。

SQL> insert into test_7 values ('北京东','北京东',to_date('2006-12-16','yyyy-mm-dd'),'B01');

1 row inserted

SQL> insert into test_7 values ('北京东','北京东',to_date('2006-12-17','yyyy-mm-dd'),'B11');

1 row inserted

SQL> insert into test_7 values ('北京东','杨浦',to_date('2006-12-23','yyyy-mm-dd'),'D11');

1 row inserted

SQL> commit;

Commit complete

    Select addr_from||replace(max(sys_connect_by_path(addr_to,',')),',',' ') path from (
    select addr_from,addr_from||(n - no) as addr,addr_to,rn,No
    from (
    select addr_from,addr_to||' '||to_char(start_date,'yyyy-mm-dd') as addr_to,
    row_number() over (order by 1) as n,
    2*row_number() over (order by 1) - decode(no,'B01',1,'B11',2,'D11',3) as rn,decode(no,'B01',1,'B11',2,'D11',3) as no
    from test_7)
    )
    start with no=1
    connect by rn-1 = prior rn
    group By addr,addr_from;


        杨浦 杨浦 2006-12-10 杨浦 2006-12-11 北京东 2006-12-15
        北京东 北京东 2006-12-01 北京东 2006-12-02 杨浦 2006-12-08
        北京东 北京东 2006-12-16 北京东 2006-12-17 杨浦 2006-12-23

使用道具 举报

回复
论坛徽章:
112
2008新春纪念徽章
日期:2008-02-13 12:43:03马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:14马上加薪
日期:2014-02-19 11:55:14马上有车
日期:2014-11-03 12:40:39沸羊羊
日期:2015-03-04 14:43:432015年新春福章
日期:2015-03-06 11:57:31慢羊羊
日期:2015-03-09 16:15:39
4#
发表于 2007-1-31 22:26 | 只看该作者

使用道具 举报

回复
论坛徽章:
0
5#
 楼主| 发表于 2007-2-1 08:21 | 只看该作者
谢谢,我去试一下

使用道具 举报

回复
论坛徽章:
0
6#
 楼主| 发表于 2007-2-1 09:17 | 只看该作者
如果数据不是这么规则,而是中间缺少一些环节,如缺少
北京东 北京东 2006-12-02 B11 这一行而还是按原要求转换该如何呢?

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
7#
发表于 2007-2-1 10:16 | 只看该作者
最初由 lcc 发布
[B]如果数据不是这么规则,而是中间缺少一些环节,如缺少
北京东 北京东 2006-12-02 B11 这一行而还是按原要求转换该如何呢? [/B]



我倒,那你还说有一个循环?关注下吧!

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
8#
发表于 2007-2-4 17:14 | 只看该作者
SQL> select * from test_7 order by start_date;

ADDR_FROM            ADDR_TO              START_DATE  NO
-------------------- -------------------- ----------- ----------
北京东               北京东               2006-12-1   B01
北京东               杨浦                 2006-12-8   D11
杨浦                 杨浦                 2006-12-10  B01
杨浦                 杨浦                 2006-12-11  B11
杨浦                 北京东               2006-12-15  D11
北京东               北京东               2006-12-16  B01
北京东               北京东               2006-12-17  B11
北京东               杨浦                 2006-12-23  D11
杨浦                 杨浦                 2006-12-25  B01
杨浦                 杨浦                 2006-12-26  B11
杨浦                 北京东               2006-12-29  D11

11 rows selected

SQL> select path from (
  2  Select addr_from||replace(sys_connect_by_path(addr_to,','),',',' ') path,rn,n from (
  3  select addr_from,addr_to||' '||to_char(start_date,'yyyy-mm-dd') as addr_to,
  4  row_number() over (order by start_date) as rn,
  5  dense_rank() over (partition by addr_from order by no) as n
  6  from test_7
  7  order by start_date)
  8  start with n=1
  9  connect by rn-1 = prior rn and addr_from = prior addr_from
10  ) where n=3
11  /

PATH
--------------------------------------------------------------------------------
北京东 北京东 2006-12-01 杨浦 2006-12-08
杨浦 杨浦 2006-12-10 杨浦 2006-12-11 北京东 2006-12-15
北京东 北京东 2006-12-16 北京东 2006-12-17 杨浦 2006-12-23
杨浦 杨浦 2006-12-25 杨浦 2006-12-26 北京东 2006-12-29

注意,可以缺少B11,但是不能缺少D11

使用道具 举报

回复
论坛徽章:
24
生肖徽章:狗
日期:2006-09-07 10:14:43数据库板块每日发贴之星
日期:2008-07-26 01:02:20生肖徽章2007版:兔
日期:2008-10-13 11:10:11奥运会纪念徽章:铁人三项
日期:2008-10-24 13:27:21开发板块每日发贴之星
日期:2008-12-27 01:01:09生肖徽章2007版:马
日期:2009-11-18 10:45:032010新春纪念徽章
日期:2010-03-01 11:21:02ITPUB9周年纪念徽章
日期:2010-10-08 09:28:51ERP板块每日发贴之星
日期:2011-05-18 01:01:01ITPUB十周年纪念徽章
日期:2011-11-01 16:21:15
9#
发表于 2007-2-5 09:31 | 只看该作者
版主呢?这个问题怎么解决啊?

是不是只能写函数了啊!

使用道具 举报

回复
10#
发表于 2007-2-6 20:22 | 只看该作者
晕了!

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表