ORACLE数据库多行数据合并为1行的问题,急用
CSRQQYPHPCZLJYXMMCJYZXYDJJE2014-5-6201405070026111.2300硅3.12601280.0000954050.8544201...
CSRQ QYPH PCZL JYXMMC JYZ XYDJ JE2014-5-6 201405070026 111.2300 硅 3.1260 1280.0000 954050.85442014-5-6 201405070026 111.2300 碳 3.4580 1280.0000 954050.85442014-5-6 201405070026 111.2300 磷 0.0770 1280.0000 954050.85442014-5-6 201405070026 111.2300 镍 6.7010 1280.0000 954050.85442014-5-6 201405070026 111.2300 铬 2.5940 1280.0000 954050.85442014-5-6 201405070026 111.2300 硫 0.2020 1280.0000 954050.8544如上所示的几行数据,其中CSRQ\QYPH\PCZL\XYDJ\JE的值都是一样的,只有JYXMMC和JYZ是不相同的,现在想要将几行数据合并为如下字段的一行:CSRQ QYPH PCZL 硅 碳 磷 镍 铬 硫 XYDJ JE其中,硅、碳、磷、镍、铬、硫的值是JYZ,另外就是JYXMMC的行数是不固定的,可能上表列出的少也可能多,需要是活动的根据查询出的结果生成,怎么实现啊.急求高手解答
有人说我排版乱,我看了看确实,直接传个图片好看
要实现的结果如下:
CSRQ QYPH PCZL 硅 碳 磷 镍 铬 硫 XYDJ JSJE
tj_angela的答案有些接近,但是我不知道JYXMMC的值有几个,是随机的,有可能有6行,也可能5行、7行的,而且JYXMMC的值也不是固定的,怎么来实现啊? 硅 碳 磷 镍 铬 硫是6个字段,数据有多少行就是多少个字段,名称还得是JYXMMC的值,而字段的值就是JYZ的值,求解。 展开
有人说我排版乱,我看了看确实,直接传个图片好看
要实现的结果如下:
CSRQ QYPH PCZL 硅 碳 磷 镍 铬 硫 XYDJ JSJE
tj_angela的答案有些接近,但是我不知道JYXMMC的值有几个,是随机的,有可能有6行,也可能5行、7行的,而且JYXMMC的值也不是固定的,怎么来实现啊? 硅 碳 磷 镍 铬 硫是6个字段,数据有多少行就是多少个字段,名称还得是JYXMMC的值,而字段的值就是JYZ的值,求解。 展开
3个回答
展开全部
你看看是不是这样的,你数据排版太混乱了
select csrq,qyph,pczl,wm_concat(jyxmmc),wm_concat(jyz),xydj,je from 表名 group by csrq,qyph,pczl,xydj,je
----------补充-----------
oracle跟sqlserver不一样,如果存储过程的话只能返回类似sqlserver中print那种
这样的话,不知道能符合你要求不
表名我起的test
create table test
(CSRQ varchar2(10),
QYPH varchar2(20),
pczl number(10,4),
jyxmmc varchar2(10),
jyz number(10,4),
xydj number(10,4),
je number(10,4))
insert into test values ('2014-5-6','201405070026',111.2300,'硅',3.1260,1280.0000,954050.8544);
insert into test values ('2014-5-6','201405070026',111.2300,'碳',3.4580,1280.0000,954050.8544);
insert into test values ('2014-5-6','201405070026',111.2300,'磷',0.0770,1280.0000,954050.8544);
insert into test values ('2014-5-6','201405070026',111.2300,'镍',6.7010,1280.0000,954050.8544);
insert into test values ('2014-5-6','201405070026',111.2300,'铬',2.5940,1280.0000,954050.8544);
insert into test values ('2014-5-6','201405070026',111.2300,'硫',0.2020,1280.0000,954050.8544);
执行
select 'csrq','qyph','pczl',replace(wm_concat(jyxmmc),',',' '),'xydj','je' from test
union all
select to_char(csrq),to_char(qyph),to_char(pczl),replace(to_char(wm_concat(jyz)),',',' '),to_char(xydj),to_char(je) from test
group by to_char(csrq),to_char(qyph),to_char(pczl),to_char(xydj),to_char(je)
结果
更多追问追答
追问
你这样显示的结果不是我要的,我要的结果里,硅碳磷镍铬等每个都是一个单独的字段,JYZ结果也独立的等于每一个JYXMMC,你看这怎么实现啊?
追答
日期那改好了,然后也把上边的优化了下,如果tmp表存在,自动删除重建
declare
v_sql varchar2(2000);
v_str varchar2(2000);
v_count int;
begin
select count(*) into v_count from user_tables where table_name='TMP';
if v_count>0 then
v_sql:='drop table tmp';
EXECUTE IMMEDIATE v_sql;
end if;
select
'create table tmp(csrq varchar2(10),
qyph varchar2(20),
pczl number(10,4)'||','||wm_concat(jyxmmc||' varchar2(20)')
||','||'xydj number(10,4),je number(10,4))' into v_sql
from test;
EXECUTE IMMEDIATE v_sql;
select ''''||to_char(csrq)||''','||to_char(qyph)||','||to_char(pczl)||','||wm_concat(jyz)||','||to_char(xydj)||','||to_char(je)
into v_str
from test
group by to_char(csrq),to_char(qyph),to_char(pczl),to_char(xydj),to_char(je);
v_sql:='insert into tmp values ('||v_str||') ';
EXECUTE IMMEDIATE v_sql;
commit;
end;
展开全部
select CSRQ,QYPH,PCZL,
sum(case when JYXMMC='硅' then JYZ else 0) as 硅,
sum(case when JYXMMC='碳' then JYZ else 0) as 碳
......
from table_name
group by CSRQ,QYPH,PCZL
;
行转列就是这样,枚举值有多少写多少
sum(case when JYXMMC='硅' then JYZ else 0) as 硅,
sum(case when JYXMMC='碳' then JYZ else 0) as 碳
......
from table_name
group by CSRQ,QYPH,PCZL
;
行转列就是这样,枚举值有多少写多少
追问
枚举值是活的,不是固定的,怎么实现啊?
追答
这个一条sql肯定是写不出来的,要用到plsql块来实现,可能有错误,你编译调试调试,哪有问题就自己修改下,只能帮你到这个份上了
declare
cursor get_JYXMMC is
select distinct JYXMMC
from table_name ;
v_jyx varchar2(20);
v_sql varchar2(1000);
begin
open get_JYXMMC;
v_sql:='select CSRQ,QYPH,PCZL';
loop
fetch get_JYXMMC into v_jyx;
exit when get_JYXMMC%notfound;
v_sql:= v_sql || ',sum(case when JYXMMC=''' || v_jyx ||''' then JYZ else 0 end) as '|| v_jyx;
end loop;
close get_JYXMMC;
v_sql:= v_sql || ' from table_name group by CSRQ,QYPH,PCZL';
excute immediate v_sql
end;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
用group by 分组吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询