表结构:
test1(tradeid integer,deminid integer,ammountid intger,ammountValue integer)
假如现在有这样的两行数据:
tradeid deminid ammountid ammountValue
1 1 1 2
1 1 3 4
想查出这样的结果:
tradeid deminid ammountid ammountValue ammountid ammountValue
1 1 1 2 3 4即tradeid,deminid相同的记录,把ammountid,ammountValue合并的一条记录里查出来,请高手帮忙看看!谢谢!在线等!
test1(tradeid integer,deminid integer,ammountid intger,ammountValue integer)
假如现在有这样的两行数据:
tradeid deminid ammountid ammountValue
1 1 1 2
1 1 3 4
想查出这样的结果:
tradeid deminid ammountid ammountValue ammountid ammountValue
1 1 1 2 3 4即tradeid,deminid相同的记录,把ammountid,ammountValue合并的一条记录里查出来,请高手帮忙看看!谢谢!在线等!
解决方案 »
- Oracle Database 10g 备份与恢复 各位这本书怎样?
- job调用的程序出现分布式事务错误ora-02050 ora-02056 ora-020563错误
- 创建表空间时,一些选项的问题
- 存储过程的创建
- 我是oracle小白啊 链接本地数据问题
- [初学]一个数据插入的问题
- group by 汇总无数据问题
- 求Linux下使用c+oci连接Oracle数据库的例子
- 我给用户什么权限可以对视图操作?
- 请教数据库连接失败的原因
- 论者有分 ,欢迎大家讨论, Oracle8i 与 Oracle9i 之间数据的通信 ,移植 , 导入导出等等还有其他兼容性问题 ?
- oracle 在xp 系统上本机使用需要安装什么?
-------------- ------------- -------------- -------------
1 1 1 2
1 1 3 4
2 2 5 6
2 2 7 8SQL>
SQL> SELECT *
2 FROM (SELECT TRADEID,
3 DEMINID,
4 AMMOUNTID,
5 AMMOUNTVALUE,
6 LEAD(AMMOUNTID) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTID",
7 LEAD(AMMOUNTVALUE) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTVALUE"
8 FROM TEST1)
9 WHERE NVL(NEW_AMMOUNTID + NEW_AMMOUNTVALUE, -1) >= 0;TRADEID DEMINID AMMOUNTID AMMOUNTVALUE NEW_AMMOUNTID NEW_AMMOUNTVALUE
------------- -------------- ----------------- ------------------ ------------- ----------------
1 1 1 2 3 4
2 2 5 6 7 8SQL>
DROP TABLE test1;
CREATE TABLE test1(tradeid integer,deminid integer,ammountid INTEGER,ammountValue integer) ;
INSERT INTO TEST1 VALUES (1, 1, 1, 2);
INSERT INTO TEST1 VALUES (1, 1, 3, 4);
INSERT INTO TEST1 VALUES (1, 1, 5, 6);
--10g的方法
SELECT TRADEID,
DEMINID,
WMSYS.WM_CONCAT(AMMOUNTID || '/' || AMMOUNTVALUE) X
FROM TEST1
GROUP BY TRADEID, DEMINID;
输出:
TRADEID DEMINID X
1 1 1/2,3/4,5/6
SQL> SELECT * FROM TEST1; TRADEID DEMINID AMMOUNTID AMMOUNTVALUE
-------------- ------------- -------------- -------------
1 1 1 2
1 1 3 4
2 2 5 6
2 2 7 8SQL>
SQL> SELECT *
2 FROM (SELECT TRADEID,
3 DEMINID,
4 AMMOUNTID,
5 AMMOUNTVALUE,
6 LEAD(AMMOUNTID) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTID",
7 LEAD(AMMOUNTVALUE) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTVALUE"
8 FROM TEST1)
9 WHERE NVL(NEW_AMMOUNTID + NEW_AMMOUNTVALUE, -1) >= 0;TRADEID DEMINID AMMOUNTID AMMOUNTVALUE NEW_AMMOUNTID NEW_AMMOUNTVALUE
------------- -------------- ----------------- ------------------ ------------- ----------------
1 1 1 2 3 4
2 2 5 6 7 8=====================
首先感谢这位兄弟,但是这个SQL还是有一定的问题,当插入
insert into TEST1 values(1,1,2,4);
insert into TEST1 values(1,1,3,4);
insert into TEST1 values(1,2,2,6);
insert into TEST1 values(1,2,2,5);
insert into TEST1 values(1,3,4,4);这条数据是查不出来的!即当该数据单独成一组的时候,就被过滤了!
DROP TABLE test1;
CREATE TABLE test1(tradeid integer,deminid integer,ammountid INTEGER,ammountValue integer) ;
INSERT INTO TEST1 VALUES (1, 1, 1, 2);
INSERT INTO TEST1 VALUES (1, 1, 3, 4);
INSERT INTO TEST1 VALUES (1, 1, 5, 6);
--10g的方法
SELECT TRADEID,
DEMINID,
WMSYS.WM_CONCAT(AMMOUNTID || '/' || AMMOUNTVALUE) X
FROM TEST1
GROUP BY TRADEID, DEMINID;
输出:
TRADEID DEMINID X
1 1 1/2,3/4,5/6
==================
感谢3楼提供的这个方法,但是我们这边用的是9i数据库,这个函数用不起来!~~
SQL> SELECT * FROM TEST1;TRADEID DEMINID AMMOUNTID AMMOUNTVALUE
----------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
1 3 4 4
1 1 1 2
1 1 3 4
2 2 5 6
2 2 7 8SQL> SELECT TRADEID,
2 DEMINID,
3 AMMOUNTID,
4 AMMOUNTVALUE,
5 NEW_AMMOUNTID,
6 NEW_AMMOUNTVALUE
7 FROM (SELECT TRADEID,
8 DEMINID,
9 AMMOUNTID,
10 AMMOUNTVALUE,
11 LEAD(AMMOUNTID) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTID",
12 LEAD(AMMOUNTVALUE) OVER(PARTITION BY TRADEID, DEMINID ORDER BY TRADEID, DEMINID) "NEW_AMMOUNTVALUE",
13 COUNT(1) OVER(PARTITION BY TRADEID, DEMINID) "COUNTS"
14 FROM TEST1)
15 WHERE NVL(NEW_AMMOUNTID + NEW_AMMOUNTVALUE, -1) >= 0
16 OR COUNTS = 1;TRADEID DEMINID AMMOUNTID AMMOUNTVALUE NEW_AMMOUNTID NEW_AMMOUNTVALUE
---------------- ---------------- ---------------------- -------------------- -------------------- ----------------------
1 1 1 2 3 4
1 3 4 4
2 2 5 6 7 8SQL>
FROM (SELECT TRADEID, DEMINID, LTRIM(SYS_CONNECT_BY_PATH(ZZ, ','), ',') X
FROM (SELECT TRADEID,
DEMINID,
AMMOUNTID || '/' || AMMOUNTVALUE ZZ,
ROW_NUMBER() OVER(PARTITION BY TRADEID, DEMINID ORDER BY AMMOUNTID) AS CURR,
ROW_NUMBER() OVER(PARTITION BY TRADEID, DEMINID ORDER BY AMMOUNTID) - 1 AS PREV
FROM TEST1)
START WITH CURR = 1
CONNECT BY PREV = PRIOR CURR
AND TRADEID = PRIOR TRADEID)
GROUP BY TRADEID, DEMINID
ORDER BY 1;
DEMINID,
WMSYS.WM_CONCAT(AMMOUNTID || '/' || AMMOUNTVALUE) X
FROM TEST1
GROUP BY TRADEID, DEMINID;
SELECT TRADEID, DEMINID, MAX(X) X
FROM (SELECT TRADEID, DEMINID, LTRIM(SYS_CONNECT_BY_PATH(ZZ, ','), ',') X
FROM (SELECT TRADEID,
DEMINID,
AMMOUNTID || '/' || AMMOUNTVALUE ZZ,
ROW_NUMBER() OVER(PARTITION BY TRADEID, DEMINID ORDER BY AMMOUNTID) AS CURR,
ROW_NUMBER() OVER(PARTITION BY TRADEID, DEMINID ORDER BY AMMOUNTID) - 1 AS PREV
FROM TEST1)
START WITH CURR = 1
CONNECT BY PREV = PRIOR CURR
AND TRADEID||DEMINID = PRIOR TRADEID||DEMINID)
GROUP BY TRADEID, DEMINID
ORDER BY 1;
输出:
TRADEID DEMINID X
1 1 1/2,3/4,5/6