大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
--1)按照你提供的表结构和最终需求似乎不需要 表1: company
创新互联长期为上1000+客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为那曲企业提供专业的成都网站制作、成都网站设计,那曲网站改版等技术服务。拥有10年丰富建站经验和众多成功案例,为您定制开发。
--2)按照你的要求结果集中列的数量似乎不能确定,所以ORCLE不能完成这个查询,但是有一个
--wmsys.wm_concat函数可以完成类似功能,请参照下面SQL:
SELECT DISTINCT X.cid,X.uid,X.uname,wmsys.wm_concat(X.position) over (partition by X.uname) AS position
FROM (
SELECT company_user.cid,company_user.uid,user.uname, company_user.position
FROM user,company_user
WHERE user.uid = company_user.uid
AND company_user.cid=1
) X
------------预计执行结果-----------------------------------------------------
cid uid uname postion
1 1 U1 P1,P2,P3
2 2 U2 P1,P2
------------结果说明-----------------------------------------------------------
--结果集中postion字段的结果是所有company_user表中满足条件的集合,
--形成一个由逗号分割的字符串
希望能够对你有帮助.如果有问题可以追问
合并可以做到,不过如果不是单一的一条记录,那不就变成笛卡尔积了?
比如有两行不同姓名的行,再有两行不同姓名1的行。
那么你得到的结果就是4行(也就是笛卡尔积),而且内容全不完全都不同,这个结果应该不是你要的吧。
比如前面的两行内容为a a a;b b b(一个字母表示一个字段,这是两行内容)
后面两行的内容为c c c;d d d(一个字母表示一个字段,这是两行内容)
那么你得到的结果就是 a a a c c c;a a a d d d;b b b c c c;b b b d d d
这个四行的结果是你要的么?
SQL select * from vb;
ID NM1 NM2
---------- ------------------------------ ------------------------------
1 a ccb
1 df dgdf
1 ewr saldfj
SQL select id,replace(name,',',' ') name from (select id,wm_concat(name) name from (select id,nm1||' '||nm2 name from vb) group by id);
ID NAME
---------- ------------------------------
1 a ccb ewr saldfj df dgdf
根据你的描述,做的以下测试:
-- 建表
CREATE TABLE kongxianji (a varchar2(20),b varchar2(20));
-- 插入数据
INSERT INTO kongxianji(a,b)VALUES('a',1);
INSERT INTO kongxianji(a,b)VALUES('b',2);
INSERT INTO kongxianji(a,b)VALUES('c',3);
INSERT INTO kongxianji(a,b)VALUES('d',4);
INSERT INTO kongxianji(a,b)VALUES('e',5);
INSERT INTO kongxianji(a,b)VALUES('f',6);
INSERT INTO kongxianji(a,b)VALUES('g',7);
COMMIT;
-- 写语句块,并执行
DECLARE
v_a varchar2(20);
v_b varchar2(50);
CURSOR r_aa IS SELECT a.a FROM kongxianji a WHERE a.b IN (2,3,6,7);
BEGIN
OPEN r_aa;
LOOP
FETCH r_aa INTO v_a;
EXIT WHEN r_aa%NOTFOUND;
v_b:= v_b||v_a;
END LOOP;
CLOSE r_aa;
dbms_output.put_line(v_b);
END;
说明:只通过一条sql语句是无法得到最终结果的,必须通过循环得到。
我现在身边没有 数据库环境 这个是我以前写的SQL
你看一下,修改一下就可以了
Oracle分组查询用逗号分隔结果SQL语句
表一:
学号 姓名
1 张三
2 李四
3 王五
。。。。
表二:
学号 选修课程
1 语文
1 数学
2 英语
2 语文
3 数学
3 英语
3 历史
。。。。。
要求查处结果
学好 姓名 选修课程所有课程名称以,隔开
1 张三 语文,数学
2 李四 英语,语文
3 王五 数学,英语,历史
;
create table a_lyh_test
as
select 1 as "学号" , '张三' as "姓名" from dual
union all
select 2 as "学号" , '李四' as "姓名" from dual
union all
select 3 as "学号" , '王五' as "姓名" from dual
;
create table b_lyh_test
as
select 1 as "学号" , '语文' as "选修课程" from dual
union all
select 1 as "学号" , '数学' as "选修课程" from dual
union all
select 2 as "学号" , '英语' as "选修课程" from dual
union all
select 2 as "学号" , '语文' as "选修课程" from dual
union all
select 3 as "学号" , '数学' as "选修课程" from dual
union all
select 3 as "学号" , '英语' as "选修课程" from dual
union all
select 3 as "学号" , '历史' as "选修课程" from dual
;
select f."学号"
,f."姓名"
,ltrim(max(sys_connect_by_path(f."选修课程",','))
keep (dense_rank last order by f.pnum),',') as "选修课程"
from
(
select t."学号"
,t."姓名"
,t."选修课程"
,row_number() over(partition by t."学号" order by t."姓名") as pnum
,row_number() over(partition by t."学号" order by t."姓名")-1 as lnum
from
(
select a."学号",a."姓名",b."选修课程"
from a_lyh_test a
,b_lyh_test b
where a."学号" = b."学号"
) t
) f
group by f."学号",f."姓名"
connect by f.lnum = prior f.pnum and f."学号" = prior f."学号"
start with f.pnum = 1;
如果这两行有个共同的其他列作为分组,标志他们是同一组、比如姓名编号之类的,是可以group by后min出来的。
select 姓名,min(引流管) as 引流管,min(化疗) as 化疗, min(放疗) as 放疗
from 记录表
group by 姓名
;