免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5271 | 回复: 10
打印 上一主题 下一主题

记录排列问题,请教高手怎么写这个SQL语句 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-04-14 14:07 |只看该作者 |倒序浏览
数据表中有下列记录:
   xm       sl
    王一    2
    王一    5
    张二    4
    张二    5
    张二    8
求SQL输出结果为:
   王一 2  王一 5
   张二 4  张二 5  张二 8

论坛徽章:
0
2 [报告]
发表于 2007-04-14 14:23 |只看该作者
用rank组内标序号

rank   xm       sl
1    王一    2
2   王一    5
1    张二    4
2    张二    5
3    张二    8

按序号做pivot(DB2可能美这个函数,就用CASE实现)

论坛徽章:
0
3 [报告]
发表于 2007-04-14 14:46 |只看该作者
不懂,能不能具体一点,谢谢

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2007-04-14 20:04 |只看该作者
这种问题,用SQL实现太复杂,用SHELL SCRIPT实现就简单多了。

论坛徽章:
0
5 [报告]
发表于 2007-04-15 09:07 |只看该作者
或者也可以先按照输出格式建立一个table,然后用procedure把数据一个一个填入。

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
6 [报告]
发表于 2007-04-15 16:44 |只看该作者
节选自我的BLOG
http://blog.chinaunix.net/u/739/showart.php?id=278401

DROP TABLE TEST;
CREATE TABLE TEST (XM  VARCHAR(, SL INTEGER);
INSERT INTO TEST
       VALUES ('王一',  2),
              ('王一',  5),
              ('张二',  4),
              ('张二',  5),
              ('张二',  ,
              ('李三',  2),
              ('李三',  4),
              ('李三',  15),
              ('李三',  29);


WITH B (FATHER,SON,XM,CHAIN) AS
    (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CAST(CHAR(A.SL) AS VARCHAR(100))
    FROM TEST A
        UNION ALL
    SELECT C.FATHER,C.SON,C.XM,B.CHAIN || C.XM || '  ' || C.SL
    FROM (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CHAR(A.SL) AS SL FROM TEST A) AS C, B
    WHERE B.SON= C.FATHER)
SELECT
    D.XM  || '  ' || D.CHAIN
FROM
    (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D
WHERE
    D.ROW_NUM = 1;


    效果如下:
db2 => WITH B (FATHER,SON,XM,CHAIN) AS
db2 (cont.) =>     (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CAST(CHAR(A.SL) AS VARCHAR(100))
db2 (cont.) =>     FROM TEST A
db2 (cont.) =>         UNION ALL
db2 (cont.) =>     SELECT C.FATHER,C.SON,C.XM,B.CHAIN || C.XM || '  ' || C.SL
db2 (cont.) =>     FROM (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CHAR(A.SL) AS SL FROM TEST A) AS C, B
db2 (cont.) =>     WHERE B.SON= C.FATHER)
db2 (cont.) => SELECT
db2 (cont.) =>     D.XM  || '  ' || D.CHAIN
db2 (cont.) => FROM
db2 (cont.) =>     (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D
db2 (cont.) => WHERE
db2 (cont.) =>     D.ROW_NUM = 1;
WITH B (FATHER,SON,XM,CHAIN) AS (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CAST(CHAR(A.SL) AS VARCHAR(100)) FROM TEST A UNION ALL SELECT C.FATHER,C.SON,C.XM,B.CHAIN || C.XM || '  ' || C.SL FROM (SELECT  A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM)) AS FATHER,A.XM || CHAR(ROW_NUMBER() OVER(PARTITION BY XM) + 1) AS SON, A.XM, CHAR(A.SL) AS SL FROM TEST A) AS C, B WHERE B.SON= C.FATHER) SELECT D.XM  || '  ' || D.CHAIN FROM (SELECT ROW_NUMBER() OVER(PARTITION BY XM ORDER BY LENGTH(CHAIN) DESC) AS ROW_NUM, B.XM,B.CHAIN FROM B) AS D WHERE D.ROW_NUM = 1

1
--------------------------------------------------------------------------------------------------------------
SQL0347W  递归公共表表达式 "DB2ADMIN.B" 可能包含无限循环。  SQLSTATE=01605

李三  2          李三  4          李三  15         李三  29
王一  2          王一  5
张二  4          张二  5          张二  8

  已选择 3 条记录,打印 1 条警告消息。


db2 =>

相信用递归的思路处理类似问题,在此之前没有人提到过。

论坛徽章:
0
7 [报告]
发表于 2007-04-15 17:38 |只看该作者
原帖由 beginner-bj 于 2007-4-15 16:44 发表
节选自我的BLOG
http://blog.chinaunix.net/u/739/showart.php?id=278401

DROP TABLE TEST;
CREATE TABLE TEST (XM  VARCHAR(, SL INTEGER);
INSERT INTO TEST
       VALUES ('王一',  2), ...


hi,能否悄悄的问一下你现在不做DBA以后,是做什么呢?

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
8 [报告]
发表于 2007-04-15 19:02 |只看该作者
你这哪是悄悄地问啊?

    我也做不了什么,只能靠出卖廉价的技术,混口饭吃。目前还是哪给的钱多,就去哪,让我做DB2,我就做DB2,不让做,只好做别的了。

论坛徽章:
0
9 [报告]
发表于 2007-04-15 20:14 |只看该作者
原帖由 beginner-bj 于 2007-4-15 19:02 发表
你这哪是悄悄地问啊?

    我也做不了什么,只能靠出卖廉价的技术,混口饭吃。目前还是哪给的钱多,就去哪,让我做DB2,我就做DB2,不让做,只好做别的了。


也许吧,我在上一家公司是不让做DB2而辞职,到了这一家却是主动离开DB2的
可如果还像以前那样喜欢DB2,就不会有现在这么多的不快乐
不管怎么说,如果不依赖于具体的某一项技术,我觉得在企业信息化领域是一件好事,虽然会有阵痛

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
10 [报告]
发表于 2007-04-15 21:29 |只看该作者
在我眼里,任何一项技术都只是谋生的手段,谈不上喜不喜欢,只能做一行,就把那行尽力做好吧。做工程师的和古时候的手工艺者没有本质的区别,都是属于劳力者。劳心者治人,劳力者治于人,治于人者食人,治人者食于人,道理一直都明白,但自己却始终不能改变自己属于劳力者的命运。

   我向往的工作就是,工作清闲,拿钱又相对较多的,管它具体从事哪一项技术呢,即使是对自己全新的东西,也不见得就有多难学。虽然不能成为劳心者,但我发现这个社会上劳力者也分很多个层次,自己尽量在劳力者这个大圈子里微调吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP