原始表:售货人 商品 数量
--------------------
A 牙膏 1
A 洗衣粉 2
A 脸盆 5要求:写一条sql语句实现下面的效果售货人 商品 数量
-----------------------------------------------
A 牙膏、洗衣粉、脸盆 8
--------------------
A 牙膏 1
A 洗衣粉 2
A 脸盆 5要求:写一条sql语句实现下面的效果售货人 商品 数量
-----------------------------------------------
A 牙膏、洗衣粉、脸盆 8
解决方案 »
- oracle 双机启动不了,修改成单机,如何修改?急
- oracle取数分组问题
- oracle 窗口函数的统计使用问题
- 如何在查询结果后加序号,带group by的查询
- 求一统计的SQL文(有点复杂)......
- 刚入门ORACLE,问个移动数据文件的问题
- 请指教,关于rollup查询结果集问题!!!
- 象select count(*) from (select hpid from jfytk group by hpid);这样的语句在pl/sql中不能用吗?
- 关于字符的问题,很奇怪
- 如何用sql语句实现将一个用户下的表导到另一个用户下
- oracle中clob字段不能用distinct?
- 如何查看oracle临时表空间当前使用了多少空间的大小?
select 售货人,WMSYS.WM_CONCAT(商品) 商品,sum(数量) 数量
from table_a
group by 售货人
create table tt (saler VARCHAR2(10),product VARCHAR2(10),num int); CREATE OR REPLACE FUNCTION str_to_number(p_str VARCHAR2) RETURN NUMBER AS
r NUMBER;
BEGIN
EXECUTE IMMEDIATE 'select '||p_str||' from dual' INTO r;
RETURN r;
END;
/
INSERT INTO TT VALUES ('A', '牙膏', 1);
INSERT INTO TT VALUES ('A', '洗衣粉', 2);
INSERT INTO TT VALUES ('A', '脸盆', 5);
COMMIT;SELECT SALER,
LTRIM(SYS_CONNECT_BY_PATH(PRODUCT, ','), ',') products,
STR_TO_NUMBER(LTRIM(SYS_CONNECT_BY_PATH(NUM, '+'), '+')) sum_num
FROM (SELECT SALER,
PRODUCT,
NUM,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) RN,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) - 1 RN1
FROM TT) WHERE CONNECT_BY_ISLEAF = 1
START WITH rn1=0
CONNECT BY PRIOR RN = RN1;
LTRIM(SYS_CONNECT_BY_PATH(PRODUCT, ','), ',') PRODUCTS,
STR_TO_NUMBER(LTRIM(SYS_CONNECT_BY_PATH(NUM, '+'), '+')) SUM_NUM
FROM (SELECT SALER,
PRODUCT,
NUM,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) RN,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) - 1 RN1,
CASE
WHEN ROW_NUMBER()
OVER(PARTITION BY SALER ORDER BY NULL) = COUNT(1)
OVER(PARTITION BY SALER ORDER BY NULL) THEN
'x'
END FLAG
FROM TT)
WHERE FLAG = 'x'
START WITH RN1 = 0
CONNECT BY PRIOR RN = RN1;
9i用:
select saler,
max(decode(rn,1,product))||','||max(decode(rn,2,product))||','||max(decode(rn,3,product))
,sum(num)
from
(
select saler,product,num,row_number() over(partition by saler order by saler) rn from tt
)
group by salerRESULT:
1 A 牙膏,洗衣粉,脸盆 8
DROP TABLE tt;
create table tt (saler VARCHAR2(10),product VARCHAR2(10),num int); INSERT INTO TT VALUES ('A', '牙膏', 1);
INSERT INTO TT VALUES ('A', '洗衣粉', 2);
INSERT INTO TT VALUES ('A', '脸盆', 5);
INSERT INTO TT VALUES ('B', '牙膏', 1);
INSERT INTO TT VALUES ('B', '洗衣粉', 5);
COMMIT;SQL:
select saler,
max(decode(rn,1,product)) ¦ ¦',' ¦ ¦max(decode(rn,2,product)) ¦ ¦',' ¦ ¦max(decode(rn,3,product))
,sum(num)
from
(
select saler,product,num,row_number() over(partition by saler order by saler) rn from tt
)
group by saler RESULT:
A 牙膏,洗衣粉,脸盆 8
B 牙膏,洗衣粉, 6
create table tt (saler VARCHAR2(10),product VARCHAR2(10),num int); CREATE OR REPLACE FUNCTION str_to_number(p_str VARCHAR2) RETURN NUMBER AS
r NUMBER;
BEGIN
EXECUTE IMMEDIATE 'select '||p_str||' from dual' INTO r;
RETURN r;
END;
/
INSERT INTO TT VALUES ('A', '牙膏', 1);
INSERT INTO TT VALUES ('A', '洗衣粉', 2);
INSERT INTO TT VALUES ('A', '脸盆', 5);
INSERT INTO TT VALUES ('b', '牙膏', 1);
INSERT INTO TT VALUES ('b', '洗衣粉', 3);
INSERT INTO TT VALUES ('b', '脸盆', 5);
COMMIT;
SELECT SALER,
LTRIM(SYS_CONNECT_BY_PATH(PRODUCT, ','), ',') PRODUCTS,
STR_TO_NUMBER(LTRIM(SYS_CONNECT_BY_PATH(NUM, '+'), '+')) SUM_NUM,
FLAG
FROM (SELECT SALER,
PRODUCT,
NUM,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) RN,
ROW_NUMBER() OVER(PARTITION BY SALER ORDER BY NULL) - 1 RN1,
CASE
WHEN ROW_NUMBER()
OVER(PARTITION BY SALER ORDER BY NULL) = COUNT(1)
OVER(PARTITION BY SALER ORDER BY NULL) THEN
'x'
END FLAG
FROM TT)
WHERE FLAG = 'x'
START WITH RN1 = 0
CONNECT BY PRIOR RN = RN1
AND PRIOR SALER = SALER;
select * from
(
select distinct a,b,c from test
)