重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
--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 姓名
;