不用下跪,我來挽救你。
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,天津網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:天津等地區(qū)。天津做網(wǎng)站價格咨詢:18980820575
select trunc((rownum - 1)/10)+1 as groups,max(field1),min(field1),avg(field1) from y61 group by trunc((rownum - 1)/10)+1 order by groups;
以NO字段為主,進行分組。
select a.no,sum(a.金額) from table a group by a.no
同一個NO,會對應(yīng)不同的姓名。
select a.no,a.姓名,sum(a.金額) from table a group by a.no,a.姓名
看不懂
目標(biāo)語句:當(dāng)收費醒目包含‘鹽’這一項,則統(tǒng)計no='10' 且 姓名=‘張三’,所有收費項目對...
select a.項目,sum(a.金額) from table a where a.收費項目= '1' and a.no = '10' and a.姓名=‘張三’ group by a.項目
按照你的說法,我的理解的如果不放group by那么可能出現(xiàn)兩行完全重復(fù)的數(shù)據(jù),是這個意思吧。
不能放day,因為day是在這個sql中起的一個別名,只有在查詢完成后day才有效果(比如在having中們就可以用),但是在group by中查詢并沒有完成,所以day沒有用。
這個有一個辦法,就是你把day前面的那一串(也就是別名day表示的那串round函數(shù)中的內(nèi)容)整個放在groupby的后面。
還有一個辦法不一定好用(這個方法有個前提,就是每個分組的最后day結(jié)果只有一個,而不是可能有好幾個),你可以在round前面加一個max或者min,這樣就是聚合函數(shù)了(也就是說不需要在groupby后面加day的那一串了),如果完全相同,那么可能只顯示一個(可能,我忘了如果存在相等的最大值時,是怎么樣的一個結(jié)果了,你可以試試),這樣就不需要大改動,就能完成了、
常用的函數(shù)有:
1、COUNT ()返回查尋的行數(shù)
例如:select count(*) from table;
2、MAX() 返回表達式的最大值
例如:select a, max(b) from table group by a;
3、MIN() 返回表達式的最小值
例如:select a, min(b) from table group by a;
4、SUM() 返回表達式的總合
例如:select a, sum(b) from table group by a;
5、AVG() 返回表達式的平均值
例如:select a, avg(b) from table group by a。
函數(shù)
函數(shù)在數(shù)學(xué)上的定義:給定一個非空的數(shù)集A,對A施加對應(yīng)法則f,記作f(A),得到另一數(shù)集B,也就是B=f(A).那么這個關(guān)系式就叫函數(shù)關(guān)系式,簡稱函數(shù)。
首先按照2列進行排序,相同的作為一組,比如:
按性別和所在系分組后:
CREATE??TABLE??info?(
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
上面這樣的效果, 是否滿足你的需求?
如果滿足的話, 你再往下看, 下面是 存儲過程的相關(guān)代碼
Oracle?需要首先在數(shù)據(jù)庫中,?創(chuàng)建好?類型?與?函數(shù)。
來實現(xiàn)一個??split?功能的處理。
--?定義一個對象類型.
CREATE?OR?REPLACE?TYPE?ty_row_str_split?as?object?(strValue?VARCHAR2?(4000));
/
--?定義一個?表/數(shù)組類型,?內(nèi)容是前面定義的那個對象.
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);
--?預(yù)期返回結(jié)果.
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?意味著沒有找到.
??--?可以理解為是查詢到最后一個單元了.
??--?設(shè)置?j?:=?len,?讓外部的循環(huán)處理可以結(jié)束了.
j??:=?len;
--?獲取最后一個單元的內(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è)置索引,?下一次再查找的時候,從指定的索引位置開始(不是從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