oracle如何多列分組,oracle一列拆分多列

Oracle如何對一個多值字段進行分組統(tǒng)計

CREATE??TABLE??info?(

我們擁有10年網頁設計和網站建設經驗,從網站策劃到網站制作,我們的網頁設計師為您提供的解決方案。為企業(yè)提供成都網站制作、成都做網站、外貿營銷網站建設、微信開發(fā)、成都小程序開發(fā)、成都做手機網站H5開發(fā)、等業(yè)務。無論您有什么樣的網站設計或者設計方案要求,我們都將富于創(chuàng)造性的提供專業(yè)設計服務并滿足您的需求。

users????varchar(100)

);

INSERT?INTO?info?VALUES('userA@userB@userC');

INSERT?INTO?info?VALUES('userB@userC@userD');

INSERT?INTO?info?VALUES('userC@userD@userE');

COLUMN?"用戶"?FORMAT?A15

SELECT

to_char(strvalue)?as?"用戶",

count(*)?AS?"用戶數(shù)"

FROM

info,

table(fn_split(?info.users,??'@'))

GROUP?BY

to_char(strvalue)

ORDER?BY

1;

用戶????????????????用戶數(shù)

---------------?----------

userA????????????????????1

userB????????????????????2

userC????????????????????3

userD????????????????????2

userE????????????????????1

上面這樣的效果, 是否滿足你的需求?

如果滿足的話, 你再往下看, 下面是 存儲過程的相關代碼

Oracle?需要首先在數(shù)據(jù)庫中,?創(chuàng)建好?類型?與?函數(shù)。

來實現(xiàn)一個??split?功能的處理。

--?定義一個對象類型.

CREATE?OR?REPLACE?TYPE?ty_row_str_split?as?object?(strValue?VARCHAR2?(4000));

/

--?定義一個?表/數(shù)組類型,?內容是前面定義的那個對象.

CREATE?OR?REPLACE?TYPE?ty_tbl_str_split?IS?TABLE?OF?ty_row_str_split;

/

--------------------

--?字符分割函數(shù).

--?參數(shù)1:??被分割的源字符串

--?參數(shù)2:??用于拆分的字符串。

--------------------

CREATE?OR?REPLACE?FUNCTION?fn_split(

p_str???????IN?VARCHAR2,

p_delimiter?IN?VARCHAR2)

RETURN?ty_tbl_str_split?IS

j?????????INT?:=?0;

i?????????INT?:=?1;

--?被分割的源字符串?的長度.

len???????INT?:=?0;

--?分隔字符串的長度

len1??????INT?:=?0;

--?暫存的中間每一個單元的文本信息.

str???????VARCHAR2(4000);

--?預期返回結果.

str_split?ty_tbl_str_split?:=?ty_tbl_str_split();

BEGIN

--?被分割的源字符串?的長度.

len???:=?LENGTH(p_str);

--?分隔字符串的長度.

len1?:=?LENGTH(p_delimiter);

--?遍歷?被分割的源字符串.

WHILE?j??len?LOOP

--?在被分割的源字符串中,?查詢?分隔字符串.

j?:=?INSTR(p_str,?p_delimiter,?i);

IF?j?=?0?THEN

--?j=0?意味著沒有找到.

??--?可以理解為是查詢到最后一個單元了.

??--?設置?j?:=?len,?讓外部的循環(huán)處理可以結束了.

j??:=?len;

--?獲取最后一個單元的內容.

str?:=?SUBSTR(p_str,?i);

--?結果追加一行.

str_split.EXTEND;

--?設置結果內容.

str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);

IF?i?=?len?THEN

EXIT;

END?IF;

ELSE

--?如果在被分割的源字符串中,找到了?分隔字符串.

--?首先,獲取分割的內容.

str?:=?SUBSTR(p_str,?i,?j?-?i);

--?然后設置索引,?下一次再查找的時候,從指定的索引位置開始(不是從0開始找了)

i?:=?j?+?len1;

--?結果追加一行.

str_split.EXTEND;

--?設置結果內容.

str_split(str_split.COUNT)?:=?ty_row_str_split(strValue?=?str);

END?IF;

END?LOOP;

RETURN?str_split;

END?fn_split;

/

函數(shù)創(chuàng)建完畢以后,可以開始做查詢的處理.

SQL?select?to_char(strvalue)?as?Value?from?table(fn_split('aa,bb,cc',','));

VALUE

-------------------------------------------------------------------------------

aa

bb

cc

oracle group by 2列 怎么分組的

首先按照2列進行排序,相同的作為一組,比如:

按性別和所在系分組后:

Oracle之查詢詳解

查詢是數(shù)據(jù)的一個重要操作。用戶發(fā)送查詢請求,經編譯軟件變異成二進制文件供服務器查詢,后返回查詢結果集給用戶,查詢會產生一個虛擬表,看到的是表形式顯示的結果,但結果并不真正的存儲,每次執(zhí)行查詢只是從數(shù)據(jù)表中提取數(shù)據(jù),并按照表的形式顯示出來。

SELECT 列名

FGROM 表名

[WHERE 查詢條件表達式]

[GROUP BY 分組表達式]

[HAVING 分組查詢表達式]

[ORDER BY 排序的列名 [ASC或DESC]]

group by 用于對查詢的結果分組統(tǒng)計,通過對group by后面的名字進行分組后輸出結果。

group by后面還可以跟多列表示 多列分組 ,在多列分組時放前面的優(yōu)先分組。

group by 列名,列名

having 子句用于限制分組顯示結果,其只能和group by一起連用。在where中沒有辦法直接使用聚合函數(shù),即sum avg等無法使用,所以引用了having,在having中可以使用這些函數(shù)。

order by 表示排序,后跟列名和排序方式。如果什么都不加默認為升序。ASC表示升序,DESC表示降序。

在Oracle中還可以設置多列排序

order by 列名1 升降,列名2 升降;

前面的為主要排序,后面的為次一級排序。

注:碰到自己與自己比較的情況下,不能用having,可以創(chuàng)建一個新列。

注:如果select語句同時包含group by,having,order by,按group by,having,order by排序

分組和聚合一起使用,目的是為了統(tǒng)計信息。

where是為了from服務的,只能跟 真實的字段 ,用來篩選from子句中指定的操作所產生的行

group by 用來分組where子句的輸出

having 用來從分組的結果中篩選行

order by用來對篩選的結果進行排序

(1)分組函數(shù):max min?avg sum count

max表示該列的最大值,min表示該列的最小值,avg表示該列的平均值,sum表示該列的和,count表示該列的行數(shù)。

注:分組函數(shù)(max、min、avg、count、sum)只能出現(xiàn)在選擇列表中having子句、order by子句、不能出現(xiàn)在where子句和group by子句中。

(2)多表查詢

多表查詢是指兩個和兩個以上的表或者是視圖的查詢,在實際應用中,當查詢單個表不能滿足需求時,一般使用多表查詢。如:顯示sales部門位置和其員工的姓名,這種情況下需要使用到(dept表和emp表)。

多表查詢的連接一般可以分為:內連接、左外連接、右外連接、全連接。

注:在使用多表查詢的時候每個表可以設置別名,如果表指定了別名,那么語句中所有語句必須使用別名,而不能再使用實際表名。且在寫屬性的時候如果屬性為其中一個表特有的屬性則不需要寫別名,如果是兩個表都有則必須指定是哪一個表的哪個屬性格式為:表名.屬性名。

select 列名 from 表1 別名,表2 別名...

注:e是emp的別名,d是dept的別名。

但如果對表進行了操作則需要設置別名,如:查詢每個部門中工資高于該部門平均工資的員工人數(shù)。在其中有一個avg表,這個表必須設置別名(提醒:如果僅有一個被修改的表,則可以不設置別名,但如果有多個表則必須設置別名)。

內連接

內連接通過使用比較運算符來使每個表的通用列中的值匹配來組成一個新表,即:把兩個表中間共有的那些行拿出來進行連接,如果某些行不是兩個表共有的,則不進行連接。

select

from 表1

inner join 表2

on 匹配條件

select

from 表1 表2

where匹配條件

左外連接

左外連接與內連接的區(qū)別是:設置左外連接的時候設置了主表和附表,主表在前,附表在后。內連接是將兩個表匹配的地方輸出出來,而左外連接則是主表全寫,附表一一對應,附表有則加上,沒有不寫。

select

from 表1

left join 表2

on 匹配條件

右外連接

右外連接和左外連接基本相同只是右外連接的主表寫在后邊。

select

from 表1

right join 表2

on 匹配條件

全連接

全連接是在等值連接的基礎上將左表和右表的未匹配數(shù)據(jù)都加上,使用的關鍵字為full outer join或者full join。

select

from 表1

full join 表2

on 匹配條件

自連接

還有一種特殊情況即自連接,在Oracle中一個表無法與自己進行比較,所以當需要自己表的兩個信息做比較的時候也需要使用連接來連接,即同一張表的連結查詢。

(3)子查詢

子查詢是指嵌套在其他sql語句中的select語句,也叫嵌套查詢。sql語句執(zhí)行順序為從右到左執(zhí)行,所以在執(zhí)行查詢時會先執(zhí)行左側的子查詢后進行主查詢。

子查詢分為單行子查詢和多行子查詢,單行子查詢是指返回一行數(shù)據(jù)的子查詢語句,多行子查詢是指返回多行數(shù)據(jù)的查詢語句。子查詢還可以分為多列子查詢、多行子查詢、多列多行子查詢。

在進行子查詢時如果內部查詢不返回任何記錄,則外部條件中字段DEPTNO與NULL比較永遠為假,也就是說外部查詢不返回任何結果。

總結為:

單行子查詢是指子查詢只返回單列、單行數(shù)據(jù)

多行子查詢是指返回單列多行數(shù)據(jù),都是針對單列而言的

多列子查詢則是指查詢返回多個列數(shù)據(jù)的子查詢語句

單行子查詢

where deptno = (單行數(shù)值)

多行子查詢

where deptno in ( 多行數(shù)值 )

多列子查詢:

where (job,deptno)=(select job,deptno from emp where ename='KING')

多列多行子查詢

where (job,deptno) in (select job,deptno from emp where ename='KING')

單行子查詢

在單行子查詢的外部查詢中可以使用=、、、=、=、等比較運算符。

內部查詢返回的結果必須與外部查詢條件中字段(DEPTNO)相匹配。

多行子查詢

在WHERE子句中使用多行子查詢時,可以使用多行比較運算符(IN,ALL,ANY)。

IN:等于任何一個。

ALL:和子查詢返回的所有值比較。例如:salALL(1,2,3)等價于sal3,即大于所有。

ANY:和子查詢返回的任意一個值比較。例如:salANY(1,2,3)等價于sal1,即大于任意一個就可以。

注:ANY運算符必須與單行比較運算符結合使用,并且返回行只要匹配子查詢的任何一個結果即可。

多列子查詢

多列子查詢和多行子查詢相同,只是使用多列子查詢的時候會有多列進行匹配。

(4)集合運算

為了合并多個select語句的結果,可以使用集合操作符號union,union all,intersect,minus。

union:該操作符用于取得兩個結果集的并集。當使用該操作符時,會自動去掉結果集中重復行

union all:該操作與union相似,但是它不會取消重復行,而且不會排序

intersect:使用該操作符用于取得兩個結果集的交集

minus:使用該操作符用于取得兩個結果集的差集,它只會顯示存在第一個集合中,而不存在第二個集合中的數(shù)據(jù)

總結為集合運算就是將兩個或者多個結果集組合成一個結果集。

intersect ?交集 返回兩個查詢共有的記錄

union all ?并集 返回各個查詢的所有記錄,包括重復的記錄

union ? ? ?交集 返回各個查詢的所有記錄,不包括重復的記錄

MINUS ? 補集 返回第一個查詢檢查出的記錄減去第二個查詢檢索出來的記錄之后剩余的記錄

注意:當使用集合操作的時候,查詢所返回的列數(shù)以及列的類型必須匹配,列名可以不同。

(1)Distinct關鍵字

在Oracle中,可能出現(xiàn)若干相同的情況,那么可以用Distinct消除重復行

(2)多表查詢與單行子查詢可以實現(xiàn)相同的功能

查詢出銷售部(sales)下面的員工姓名,工作,工資

(3)顯示高于自己部門平均工資的員工信息

分析:

1.找到所有部門的平均工資

select deptno,avg(sal) from emp group by deptno;

2.找到所有人的工資信息

select ename,sal,deptno from emp;

3.把兩個結果集使用多表連接組合組合起來

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno;

4.去掉低于平均工資的那些數(shù)據(jù)即可:

select * from emp,(select deptno,avg(sal) avgsal from emp group by deptno) damao where emp.deptno=damao.deptno and salavgsal;

(4)emp表介紹

字段? ? ? ? ? ? ? 類型? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 描述

empno ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示雇員編號,是唯一編號

ename ? ? ? ? ?VAECHAR2(10) ? ? ? ? ? 表示雇員姓名

job ? ? ? ? ? ? ? ?VARCHAR2(9) ? ? ? ? ? ? 表示工作職位

mgr ? ? ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示一個雇員的領導編號

hiredate ? ? ? DATE ? ? ? ? ? ? ? ? ? ? ? ? ? ?表示雇傭日期

sal ? ? ? ? ? ? ? NUMBER(7,2) ? ? ? ? ? ? ? 表示月薪,工資

comm ? ? ? ? ?NUMBER(7,2) ? ? ? ? ? ? ? 表示獎金,或者稱為傭金

deptno ? ? ? ? NUMBER(2) ? ? ? ? ? ? ? ? 部門編號

oracle里面怎么多個字段分組排序

分組排序需要用到group by子句,如果要添加分組條件,還要在之后加having子句

如:

select avg(sal),deptno

from emp

group by deptno

having avg(sal)2000;

關于oracle怎么做多次分組

以NO字段為主,進行分組。

select a.no,sum(a.金額) from table a group by a.no

同一個NO,會對應不同的姓名。

select a.no,a.姓名,sum(a.金額) from table a group by a.no,a.姓名

看不懂

目標語句:當收費醒目包含‘鹽’這一項,則統(tǒng)計no='10' 且 姓名=‘張三’,所有收費項目對...

select a.項目,sum(a.金額) from table a where a.收費項目= '1' and a.no = '10' and a.姓名=‘張三’ group by a.項目

當前文章:oracle如何多列分組,oracle一列拆分多列
瀏覽路徑:http://m.kartarina.com/article18/dseisdp.html

成都網站建設公司_創(chuàng)新互聯(lián),為您提供品牌網站設計全網營銷推廣手機網站建設網站設計虛擬主機關鍵詞優(yōu)化

廣告

聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

h5響應式網站建設
主站蜘蛛池模板: 亚洲成a人无码亚洲成www牛牛| 亚洲高清无码综合性爱视频| 亚洲AV综合色区无码一区爱AV| 国产aⅴ无码专区亚洲av麻豆| 亚洲欧洲精品无码AV| 久久久久久国产精品无码超碰 | 蜜桃臀无码内射一区二区三区| 无码无套少妇毛多18PXXXX| 日韩少妇无码一区二区三区| 麻豆亚洲AV永久无码精品久久| 精品无码国产污污污免费网站国产| 久久久久久国产精品免费无码| 国产丝袜无码一区二区三区视频| 人妻精品无码一区二区三区| 亚洲va无码手机在线电影| 影院无码人妻精品一区二区| 亚洲av永久无码天堂网| 久久精品国产亚洲AV无码娇色 | 无码夫の前で人妻を侵犯| 超清无码无卡中文字幕| 无码国产亚洲日韩国精品视频一区二区三区 | 无码AV岛国片在线播放| 97无码人妻福利免费公开在线视频 | 亚洲欧洲日产国码无码久久99| 免费无码国产在线观国内自拍中文字幕| 中文字幕无码不卡一区二区三区 | 高清无码中文字幕在线观看视频| 中文字幕无码久久人妻| 国产嫖妓一区二区三区无码| 亚洲AV无码专区国产乱码不卡| 无码超乳爆乳中文字幕久久| 免费a级毛片无码a∨免费软件| 精品久久久无码中文字幕| 国产精品成人99一区无码| 人妻少妇精品无码专区漫画| 国产成年无码久久久久下载| 久久精品日韩av无码| 国产精品无码无片在线观看3D| 国产成人无码aa精品一区| 精品久久久久久无码人妻热 | 永久免费无码网站在线观看|