真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

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

Oracle如何對(duì)一個(gè)多值字段進(jìn)行分組統(tǒng)計(jì)

CREATE??TABLE??info?(

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

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

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

如果滿足的話, 你再往下看, 下面是 存儲(chǔ)過(guò)程的相關(guān)代碼

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

來(lái)實(shí)現(xiàn)一個(gè)??split?功能的處理。

--?定義一個(gè)對(duì)象類型.

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

/

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

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;

--?被分割的源字符串?的長(zhǎng)度.

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

--?分隔字符串的長(zhǎng)度

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

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

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

--?預(yù)期返回結(jié)果.

str_split?ty_tbl_str_split?:=?ty_tbl_str_split();

BEGIN

--?被分割的源字符串?的長(zhǎng)度.

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

--?分隔字符串的長(zhǎng)度.

len1?:=?LENGTH(p_delimiter);

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

WHILE?j??len?LOOP

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

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

IF?j?=?0?THEN

--?j=0?意味著沒(méi)有找到.

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

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

j??:=?len;

--?獲取最后一個(gè)單元的內(nèi)容.

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

--?結(jié)果追加一行.

str_split.EXTEND;

--?設(shè)置結(jié)果內(nèi)容.

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

IF?i?=?len?THEN

EXIT;

END?IF;

ELSE

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

--?首先,獲取分割的內(nèi)容.

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

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

i?:=?j?+?len1;

--?結(jié)果追加一行.

str_split.EXTEND;

--?設(shè)置結(jié)果內(nèi)容.

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列進(jìn)行排序,相同的作為一組,比如:

按性別和所在系分組后:

Oracle之查詢?cè)斀?/h2>

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

SELECT 列名

FGROM 表名

[WHERE 查詢條件表達(dá)式]

[GROUP BY 分組表達(dá)式]

[HAVING 分組查詢表達(dá)式]

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

group by 用于對(duì)查詢的結(jié)果分組統(tǒng)計(jì),通過(guò)對(duì)group by后面的名字進(jìn)行分組后輸出結(jié)果。

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

group by 列名,列名

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

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

在Oracle中還可以設(shè)置多列排序

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

前面的為主要排序,后面的為次一級(jí)排序。

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

注:如果select語(yǔ)句同時(shí)包含group by,having,order by,按group by,having,order by排序

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

where是為了from服務(wù)的,只能跟 真實(shí)的字段 ,用來(lái)篩選from子句中指定的操作所產(chǎn)生的行

group by 用來(lái)分組where子句的輸出

having 用來(lái)從分組的結(jié)果中篩選行

order by用來(lái)對(duì)篩選的結(jié)果進(jìn)行排序

(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)多表查詢

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

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

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

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

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

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

內(nèi)連接

內(nèi)連接通過(guò)使用比較運(yùn)算符來(lái)使每個(gè)表的通用列中的值匹配來(lái)組成一個(gè)新表,即:把兩個(gè)表中間共有的那些行拿出來(lái)進(jìn)行連接,如果某些行不是兩個(gè)表共有的,則不進(jìn)行連接。

select

from 表1

inner join 表2

on 匹配條件

select

from 表1 表2

where匹配條件

左外連接

左外連接與內(nèi)連接的區(qū)別是:設(shè)置左外連接的時(shí)候設(shè)置了主表和附表,主表在前,附表在后。內(nèi)連接是將兩個(gè)表匹配的地方輸出出來(lái),而左外連接則是主表全寫,附表一一對(duì)應(yīng),附表有則加上,沒(méi)有不寫。

select

from 表1

left join 表2

on 匹配條件

右外連接

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

select

from 表1

right join 表2

on 匹配條件

全連接

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

select

from 表1

full join 表2

on 匹配條件

自連接

還有一種特殊情況即自連接,在Oracle中一個(gè)表無(wú)法與自己進(jìn)行比較,所以當(dāng)需要自己表的兩個(gè)信息做比較的時(shí)候也需要使用連接來(lái)連接,即同一張表的連結(jié)查詢。

(3)子查詢

子查詢是指嵌套在其他sql語(yǔ)句中的select語(yǔ)句,也叫嵌套查詢。sql語(yǔ)句執(zhí)行順序?yàn)閺挠业阶髨?zhí)行,所以在執(zhí)行查詢時(shí)會(huì)先執(zhí)行左側(cè)的子查詢后進(jìn)行主查詢。

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

在進(jìn)行子查詢時(shí)如果內(nèi)部查詢不返回任何記錄,則外部條件中字段DEPTNO與NULL比較永遠(yuǎn)為假,也就是說(shuō)外部查詢不返回任何結(jié)果。

總結(jié)為:

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

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

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

單行子查詢

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')

單行子查詢

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

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

多行子查詢

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

IN:等于任何一個(gè)。

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

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

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

多列子查詢

多列子查詢和多行子查詢相同,只是使用多列子查詢的時(shí)候會(huì)有多列進(jìn)行匹配。

(4)集合運(yùn)算

為了合并多個(gè)select語(yǔ)句的結(jié)果,可以使用集合操作符號(hào)union,union all,intersect,minus。

union:該操作符用于取得兩個(gè)結(jié)果集的并集。當(dāng)使用該操作符時(shí),會(huì)自動(dòng)去掉結(jié)果集中重復(fù)行

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

intersect:使用該操作符用于取得兩個(gè)結(jié)果集的交集

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

總結(jié)為集合運(yùn)算就是將兩個(gè)或者多個(gè)結(jié)果集組合成一個(gè)結(jié)果集。

intersect ?交集 返回兩個(gè)查詢共有的記錄

union all ?并集 返回各個(gè)查詢的所有記錄,包括重復(fù)的記錄

union ? ? ?交集 返回各個(gè)查詢的所有記錄,不包括重復(fù)的記錄

MINUS ? 補(bǔ)集 返回第一個(gè)查詢檢查出的記錄減去第二個(gè)查詢檢索出來(lái)的記錄之后剩余的記錄

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

(1)Distinct關(guān)鍵字

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

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

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

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

分析:

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

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

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

select ename,sal,deptno from emp;

3.把兩個(gè)結(jié)果集使用多表連接組合組合起來(lái)

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) ? ? ? ? ? ? ? ? 表示雇員編號(hào),是唯一編號(hào)

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

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

mgr ? ? ? ? ? ? ?NUMBER(4) ? ? ? ? ? ? ? ? 表示一個(gè)雇員的領(lǐng)導(dǎo)編號(hào)

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

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

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

deptno ? ? ? ? NUMBER(2) ? ? ? ? ? ? ? ? 部門編號(hào)

oracle里面怎么多個(gè)字段分組排序

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

如:

select avg(sal),deptno

from emp

group by deptno

having avg(sal)2000;

關(guān)于oracle怎么做多次分組

以NO字段為主,進(jìn)行分組。

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

同一個(gè)NO,會(huì)對(duì)應(yīng)不同的姓名。

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

看不懂

目標(biāo)語(yǔ)句:當(dāng)收費(fèi)醒目包含‘鹽’這一項(xiàng),則統(tǒng)計(jì)no='10' 且 姓名=‘張三’,所有收費(fèi)項(xiàng)目對(duì)...

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


當(dāng)前名稱:oracle如何多列分組,oracle一列拆分多列
標(biāo)題來(lái)源:http://weahome.cn/article/dseisdp.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部