Oracle分析函数/聚合函数使用总结 .
总结: group by rollup(field1,field2); group by cube(field1,field2); group by grouping sets(field1,field2); 生成测试脚本: [c-sharp:nogutter:collapse:showcolumns] view plaincopyprint? ·········10········20········30
总结:
group by rollup(field1,field2);
group by cube(field1,field2);
group by grouping sets(field1,field2);
生成测试脚本:
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- SQL> CREATE TABLE Bill
- 2 (Bill_Month VARCHAR2(6),
- 3 Area_Code INTEGER,
- 4 Net_Type CHAR(1),
- 5 Local_Fare NUMBER(10,2))
插入测试数据:
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5761,'J',5667089.85 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5762,'G',6315075.96 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5762,'J',6328716.15 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5763,'G',8861742.59 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5763,'J',7788036.32 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5764,'G',6028670.45 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5764,'J',6459121.49 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5765,'G',13156065.77);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200405',5765,'J',11901671.70);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5761,'G',7614587.96 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5761,'J',5704343.05 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5762,'G',6556992.60 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5762,'J',6238068.05 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5763,'G',9130055.46 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5763,'J',7990460.25 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5764,'G',6387706.01 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5764,'J',6907481.66 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5765,'G',13562968.81);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200406',5765,'J',12495492.50);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5761,'G',7987050.65 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5761,'J',5723215.28 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5762,'G',6833096.68 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5762,'J',6391201.44 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5763,'G',9410815.91 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5763,'J',8076677.41 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5764,'G',6456433.23 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5764,'J',6987660.53 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5765,'G',14000101.20);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200407',5765,'J',12301780.20);
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5761,'G',8085170.84 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5761,'J',6050611.37 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5762,'G',6854584.22 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5762,'J',6521884.50 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5763,'G',9468707.65 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5763,'J',8460049.43 );
- insert into Bill (Bill_Month,Area_Code,Net_Type,Local_Fare) values('200408',5764,'G',6587559.23 );
1.ROLLUP
ROLLUP是对group by的扩展,因此,它只能出现在group by子句中,依赖于分组的列,对每个分组会生成汇总数据,如下:
SELECT ….
FROM ….
GROUP BY ROLLUP(C1,C2,C3….C(n-1),C(n));
总共会进行n+1个分组,那么实际上有n+1个group by的union all结果。
第1个分组:全分组。C1,C2,C3….C(n-1),C(n)
第2个分组:C1,C2,C3….C(n-1);//这个分组实际上就是对前面前n-1列分组的小计.
----然后逐渐递减分组列
第n个分组:C1。对上一个分组的小计。
第n+1个分组。不分组全量汇总,相当于合计,也是对group by C1的小计,相当于group by null。
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- SELECT NVL(TO_CHAR(AREA_CODE), '总计') AREA_CODE,
- SUM(LOCAL_FARE) LOCAL_FARE
- FROM BILL
- GROUP BY ROLLUP(AREA_CODE)
--result
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- AREA_CODE LOCAL_FARE
- 5764 45814632.6
- 5761 54225413.04
- 5762 52039619.6
- 5763 69186545.02
- 5765 77418080.18
- 合计 298684290.44
2.cube
CUBE(交叉列表)也是对group by运算的一种扩展,它比rollup扩展更加精细,组合类型更多,rollup是按组合的列从右到左递减分组计算,而CUBE则是对所有可能的组合情况进行分组,这样分组的情况更多,覆盖所有的可能分组,并计算所有可能的分组的小计。比如:
CUBE(C1,C2,C3……C(N))对N个列进行CUBE分组,那么可能的分组情况有:
不分组:C(n,0)
取一列分组:C(n,1)
-----
取N列分组,全分组:C(n,n)
那么运用数学上的组合公式,得出所有所有可能的组合方式有:C(n,0)+C(n,1)+….+C(n,n)=2^n种。
我们以前面的rollup组合列为例子:rollup(name,month)是计算按区域名和月份分组以及每个区域的所有月份的小计以及总计。但是使用 cube(name,month)则有4种分组,比rollup多一个每个月的所有区域的小计。下面比较一下这两种分组方式:
分组公式 描述
rollup(name,month) 分组情况有:
group by name,month
group by name,null //每个区域所有月份小计
group by null,null //合计
cube(name,month) 分组情况有:
group by null,null //总计
group by null,month //每个月份的所有区域小计
group by name,null //每个区域的所有月份小计
group by name,month
CUBE使用方式:
和rollup一样,是
select …
from …
group by cube(分组列列表)
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- SELECT (NVL(BILL_MONTH, '月份')) BILL_MONTH,
- (TO_CHAR(AREA_CODE)) AREA_CODE,
- SUM(LOCAL_FARE) LOCAL_FARE
- FROM BILL
- GROUP BY CUBE(AREA_CODE, BILL_MONTH)
- ORDER BY BILL_MONTH, AREA_CODE
--result
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- BILL_MONTH AREA_CODE LOCAL_FARE
- 200405 5761 13060433.89
- 200405 5762 12643792.11
- 200405 5763 16649778.91
- 200405 5764 12487791.94
- 200405 5765 25057737.47
- 200405 79899534.32
- 200406 5761 13318931.01
- 200406 5762 12795060.65
- 200406 5763 17120515.71
- 200406 5764 13295187.67
- 200406 5765 26058461.31
- 200406 82588156.35
- 200407 5761 13710265.93
- 200407 5762 13224298.12
- 200407 5763 17487493.32
- 200407 5764 13444093.76
- 200407 5765 26301881.4
- 200407 84168032.53
- 200408 5761 14135782.21
- 200408 5762 13376468.72
- 200408 5763 17928757.08
- 200408 5764 6587559.23
- 200408 52028567.24
- 月份 5761 54225413.04
- 月份 5762 52039619.6
- 月份 5763 69186545.02
- 月份 5764 45814632.6
- 月份 5765 77418080.18
- 月份 298684290.44
扩展一下,GROUPING函数
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- SELECT DECODE(GROUPING(AREA_CODE), 1, 'all area', TO_CHAR(AREA_CODE)) AREA_CODE,
- DECODE(GROUPING(BILL_MONTH), 1, 'all month', BILL_MONTH) BILL_MONTH,
- SUM(LOCAL_FARE) LOCAL_FARE
- FROM bill
- GROUP BY CUBE(AREA_CODE, BILL_MONTH)
- ORDER BY AREA_CODE, BILL_MONTH NULLS LAST
--Result
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- 5761 200405 13060433.89
- 5761 200406 13318931.01
- 5761 200407 13710265.93
- 5761 200408 14135782.21
- 5761 all month 54225413.04
- 5762 200405 12643792.11
- 5762 200406 12795060.65
- 5762 200407 13224298.12
- 5762 200408 13376468.72
- 5762 all month 52039619.6
- 5763 200405 16649778.91
- 5763 200406 17120515.71
- 5763 200407 17487493.32
- 5763 200408 17928757.08
- 5763 all month 69186545.02
- 5764 200405 12487791.94
- 5764 200406 13295187.67
- 5764 200407 13444093.76
- 5764 200408 6587559.23
- 5764 all month 45814632.6
- 5765 200405 25057737.47
- 5765 200406 26058461.31
- 5765 200407 26301881.4
- 5765 all month 77418080.18
- all area 200405 79899534.32
- all area 200406 82588156.35
- all area 200407 84168032.53
- all area 200408 52028567.24
- all area all month 298684290.44
以上我们已经掌握了rollup,cube分组统计的知识。但是rollup和cube的分组统计包含了常规group by的统计明细以及对相关列的小计和合计值。如果我们需要的只是按每个分组列小计呢?oracle提供了grouping sets操作,对group by的另一个扩展,专门对分组列分别进行小计计算,不包括合计。使用方式和rollup和cube一样,都是放在group by中。如:
grouping sets(C1,C2….Cn)则分组方式有n种,等于列的数目。
group by c1,null,null…..null。
group by null,c2,null….null。
….
group by null,null……..Cn。
无group by null,null….null,也就是说没有合计行。
注意:grouping sets的统计结果和列的顺序无关。
有时我们只需要月、地区统计结果:
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- SELECT DECODE(GROUPING(AREA_CODE), 1, 'all area', TO_CHAR(AREA_CODE)) AREA_CODE,
- DECODE(GROUPING(BILL_MONTH), 1, 'all month', BILL_MONTH) BILL_MONTH,
- SUM(LOCAL_FARE) LOCAL_FARE
- FROM BILL
- GROUP BY GROUPING SETS(AREA_CODE, BILL_MONTH);
--result
[c-sharp:nogutter:collapse:showcolumns] view plaincopyprint?
·········10········20········30········40········50········60········70········80········90········100·······110·······120·······130·······140·······150
- AREA_CODE BILL_MONTH LOCAL_FARE
- 5764 all month 45814632.6
- 5761 all month 54225413.04
- 5762 all month 52039619.6
- 5763 all month 69186545.02
- 5765 all month 77418080.18
- all area 200405 79899534.32
- all area 200406 82588156.35
- all area 200407 84168032.53
- all area 200408 52028567.24
3.ROWS
rows是物理行,就是按行的位置,根据位置计算窗口范围
sql query
[c-sharp:collapse] view plaincopyprint?
- select bill_month,area_code,net_type,local_fare,sum(local_fare) over(order by local_fare rows between current row and 1 following) sum_fare
- from bill
- /
- BILL_M AREA_CODE N LOCAL_FARE SUM_FARE
- ------ ---------- - ---------- ----------
- 200405 5761 J 5667089.85 11371432.9
- 200406 5761 J 5704343.05 11733013.5
- 200405 5764 G 6028670.45 12266738.5
- 200406 5762 J 6238068.05 12625774.1
- 200406 5764 G 6387706.01 12846827.5
- 200405 5764 J 6459121.49 13016114.1
- 200406 5762 G 6556992.6 13464474.3
- 200406 5764 J 6907481.66 14522069.6
- 200406 5761 G 7614587.96 15402624.3
- 200405 5763 J 7788036.32 15778496.6
- 200406 5763 J 7990460.25 16852202.8
- BILL_M AREA_CODE N LOCAL_FARE SUM_FARE
- ------ ---------- - ---------- ----------
- 200405 5763 G 8861742.59 17991798.1
- 200406 5763 G 9130055.46 9130055.46
- 13 rows selected.
4.RANGE
RANGE是逻辑行,是按单元格值和偏移量计算窗口范围.
Range是逻辑行的范围 ,要经过 计算 的,一般range后面是数值或时间间隔等,这样根据 当行和range的表达 式能计算当
行对应的窗口范围;
[c-sharp:collapse] view plaincopyprint?
- select bill_month,area_code,net_type,local_fare,sum(local_fare) over(order by local_fare range between current row and 122350 following) sum_fare
- from bill
- /
- BILL_M AREA_CODE N LOCAL_FARE SUM_FARE
- ------ ---------- - ---------- ----------
- 200405 5761 J 5667089.85 11371432.9
- 200406 5761 J 5704343.05 5704343.05
- 200405 5764 G 6028670.45 6028670.45
- 200406 5762 J 6238068.05 6238068.05
- 200406 5764 G 6387706.01 12846827.5
- 200405 5764 J 6459121.49 13016114.1
- 200406 5762 G 6556992.6 6556992.6
- 200406 5764 J 6907481.66 6907481.66
- 200406 5761 G 7614587.96 7614587.96
- 200405 5763 J 7788036.32 7788036.32
- 200406 5763 J 7990460.25 7990460.25
- BILL_M AREA_CODE N LOCAL_FARE SUM_FARE
- ------ ---------- - ---------- ----------
- 200405 5763 G 8861742.59 8861742.59
- 200406 5763 G 9130055.46 9130055.46
- 13 rows selected.
5.RATIO_TO_REPORT
The RATIO_TO_REPORT
function computes the ratio of a value to the sum of a set of values. If the expression
value
expression
evaluates to NULL
,
RATIO_TO_REPORT
also evaluates to NULL
, but it is treated as zero for computing the sum of values for the denominator. Its syntax is:
RATIO_TO_REPORT ( expr ) OVER ( [query_partition_clause] )
[c-sharp:collapse] view plaincopyprint?
- select bill_month,area_code,net_type,local_fare,ratio_to_report(local_fare) over() rate
- from bill
- /
- BILL_M AREA_CODE N LOCAL_FARE RATE
- ------ ---------- - ---------- ----------
- 200405 5761 J 5667089.85 .062047734
- 200405 5763 G 8861742.59 .097025293
- 200405 5763 J 7788036.32 .085269516
- 200405 5764 G 6028670.45 .066006602
- 200405 5764 J 6459121.49 .070719517
- 200406 5761 G 7614587.96 .083370468
- 200406 5761 J 5704343.05 .062455612
- 200406 5762 G 6556992.6 .071791086
- 200406 5762 J 6238068.05 .068299251
- 200406 5763 G 9130055.46 .099962992
- 200406 5763 J 7990460.25 .087485812
- BILL_M AREA_CODE N LOCAL_FARE RATE
- ------ ---------- - ---------- ----------
- 200406 5764 G 6387706.01 .069937604
- 200406 5764 J 6907481.66 .075628515

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Oracle에 대한 솔루션은 개설 할 수 없습니다. 1. 데이터베이스 서비스 시작; 2. 청취자를 시작하십시오. 3. 포트 충돌을 확인하십시오. 4. 환경 변수를 올바르게 설정하십시오. 5. 방화벽이나 바이러스 백신 소프트웨어가 연결을 차단하지 않도록하십시오. 6. 서버가 닫혀 있는지 확인하십시오. 7. RMAN을 사용하여 손상된 파일을 복구하십시오. 8. TNS 서비스 이름이 올바른지 확인하십시오. 9. 네트워크 연결 확인; 10. Oracle 소프트웨어를 다시 설치하십시오.

Oracle에서 모든 데이터를 삭제하려면 다음 단계가 필요합니다. 1. 연결 설정; 2. 외국의 주요 제약을 비활성화합니다. 3. 테이블 데이터 삭제; 4. 거래 제출; 5. 외국 키 제약 조건을 활성화합니다 (선택 사항). 데이터 손실을 방지하려면 실행하기 전에 데이터베이스를 백업하십시오.

Oracle Cursor Closure 문제를 해결하는 방법에는 다음이 포함됩니다. Close 문을 사용하여 커서를 명시 적으로 닫습니다. For Update 절에서 커서를 선언하여 범위가 종료 된 후 자동으로 닫히십시오. 연관된 PL/SQL 변수가 닫히면 자동으로 닫히도록 사용 절에서 커서를 선언하십시오. 예외 처리를 사용하여 예외 상황에서 커서가 닫혀 있는지 확인하십시오. 연결 풀을 사용하여 커서를 자동으로 닫습니다. 자동 제출을 비활성화하고 커서 닫기를 지연시킵니다.

Oracle 데이터베이스 페이징은 rownum pseudo-columns 또는 fetch 문을 사용하여 구현합니다. Fetch 문은 지정된 첫 번째 행 수를 얻는 데 사용되며 간단한 쿼리에 적합합니다.

Oracle에서 FOR 루프 루프는 커서를 동적으로 생성 할 수 있습니다. 단계는 다음과 같습니다. 1. 커서 유형을 정의합니다. 2. 루프를 만듭니다. 3. 커서를 동적으로 만듭니다. 4. 커서를 실행하십시오. 5. 커서를 닫습니다. 예 : 커서는 상위 10 명의 직원의 이름과 급여를 표시하기 위해주기별로 만들 수 있습니다.

Oracle 데이터베이스를 중지하려면 다음 단계를 수행하십시오. 1. 데이터베이스에 연결하십시오. 2. 즉시 종료; 3. 셧다운은 완전히 중단됩니다.

SQL 문은 Oracle의 동적 SQL을 사용하여 런타임 입력을 기반으로 작성 및 실행할 수 있습니다. 단계에는 다음이 포함됩니다 : 동적으로 생성 된 SQL 문을 저장할 빈 문자열 변수 준비. 즉시 실행 또는 준비 명령문을 사용하여 동적 SQL 문을 컴파일하고 실행하십시오. 바인드 변수를 사용하여 사용자 입력 또는 기타 동적 값을 동적 SQL로 전달하십시오. 동적 SQL 문을 실행하려면 즉시 실행 또는 실행을 사용하십시오.

Centos 시스템에서 Hadoop 분산 파일 시스템 (HDF)을 구축하려면 여러 단계가 필요합니다. 이 기사는 간단한 구성 안내서를 제공합니다. 1. 초기 단계에서 JDK를 설치할 준비 : 모든 노드에 JavadevelopmentKit (JDK)을 설치하면 버전이 Hadoop과 호환되어야합니다. 설치 패키지는 Oracle 공식 웹 사이트에서 다운로드 할 수 있습니다. 환경 변수 구성 : /etc /프로파일 파일 편집, Java 및 Hadoop 설정 설정 시스템에서 JDK 및 Hadoop의 설치 경로를 찾을 수 있습니다. 2. 보안 구성 : SSH 비밀번호가없는 로그인 SSH 키 : 각 노드에서 ssh-keygen 명령을 사용하십시오.
