SQL 로 통계 보고서 의 '소계' 와 '합계' 를 실현 합 니 다.

SQL 로 통계 보고서 의 '소계' 와 '합계' 를 실현 합 니 다.
통계 보고 서 를 개발 하 는 과정 에서 조회 한 데이터 가 집중 되 고 작은 줄 과 합계 줄 을 삽입 하 는 경우 가 많다.예 를 들 어 담배 굽 기 시스템 에서 거의 모든 통계 보고 서 는 '합계' 줄 을 넣 어야 하고 담뱃잎 등급 과 관련 된 통계 보고 서 는 각 담뱃잎 등급 의 소계 줄 을 넣 어야 한다.나 는 많은 사람들 (나 자신 포함) 이 프로그램 에서 전문 적 으로 몇 가지 방법 을 써 서 처리 하 는 것 을 보 았 는데, 어떤 방법 은 여전히 매우 번거롭다.최근 SQL Server 2000 의 온라인 총서 에서 야 GROUPING 취 합 함수 와 ROLLUP 연산 자 를 이용 해 통계 에 소계 와 합산 기능 을 쉽게 구현 할 수 있 음 을 발견 했다.
1. GROUPPING 과 ROLLUP 의 기본 지식
1.1. GROUPPING
집합 함수 입 니 다. 큐 브 나 ROLLUP 연산 자 를 사용 하여 줄 을 추가 할 때 추 가 된 열 출력 값 은 1 입 니 다. 추 가 된 줄 이 큐 브 나 ROLLUP 에서 생 성 되 지 않 을 때 추가 열 값 은 0 입 니 다.
문법: GROUPING ( column_name )파라미터: columnname 은 그룹 BY 자구 에서 큐 브 나 ROLLUP 의 빈 값 을 검사 하 는 열 입 니 다.
반환 형식: int
비고: 큐 브 와 롤 업 이 되 돌려 주 는 빈 값 과 표준 빈 값 을 구분 하 는 데 사용 합 니 다.큐 브 나 ROLLUP 작업 결과 로 되 돌아 오 는 NULL 은 NULL 의 특수 한 응용 프로그램 입 니 다.
1.2. ROLLUP
ROLLUP 연산 자 는 집합 집합 을 생 성하 고 정 보 를 모 아야 할 때 이 연산 은 매우 유용 하 다.이 연산 자가 생 성 한 결과 집합 은 큐 브 연산 자가 생 성 한 결과 집합 과 유사 하 다.그러나 이들 두 가 지 는 차이 가 있다. 큐 브 가 만 든 결과 집 은 선택 한 열 에 있 는 모든 조합의 집합 을 보 여 준다.ROLLUP 에서 생 성 된 결과 집합 은 선택 한 열 에 있 는 값 의 특정한 차원 구조의 집합 을 보 여 줍 니 다.
문법: ROLLUP ( column_name1[ ,column_name2。。。] )용법: GROUP BY 자구 에 사용 합 니 다.그룹 을 나 누고 그룹의 집합 데 이 터 를 모 아야 하 는 열 에 대해 서 는 이 열 에 ROLLUP 연산 자 를 추가 하 십시오.
주의: "GROUP BY ROLLUP (col 1, col 2)" 과 "GROUP BY ROLLUP (col 1), ROLLUP (col 2)" 는 차이 가 있 습 니 다.'GROUP BY ROLLUP (col 1), ROLLUP (col 2)' 은 사실상 'GROUP BY CUBE (col 1, col 2)' 에 해당 한다. 각 그룹의 집합 을 모 아야 하기 때문이다."GROUP BY ROLLUP (col 1, col 2)" 과 "GROUP BY ROLLUP (col 2, col 1)" 도 차이 가 있 습 니 다. 전 자 는 모든 col 1 의 유일한 값 에 대해 col 1 에서 각 col 2 의 집합 값 을 모 은 줄 을 만 들 고 모든 col 1 과 col2 의 집합 값 에 대해 하나의 집합 줄 을 만 듭 니 다.후 자 는 모든 col 2 의 유일한 값 에 대해 col 2 에서 각 col 1 집합 값 의 집합 줄 을 만 들 고 모든 col 1 과 col 2 의 집합 값 에 대해 하나의 집합 줄 을 만 듭 니 다.이렇게 말 하면 논리 가 그다지 명확 하지 않 을 수도 있 으 니, 우 리 는 아래 의 도 표를 보면 한눈 에 알 수 있다.
col1
col2
amount
col1
col2
amount
3
2
3584777
3
2
3584777
3
3
12774875
4
2
200789.1
3
16359652
5
2
274432
4
2
200789.1
2
4059998
4
3
8619498
3
3
12774875
4
8820288
4
3
8619498
5
2
274432
5
3
2024463
5
3
2024463
3
23418837
5
2298895
27478835
27478835
GROUP BY ROLLUP (col 1, col 2) 효과
GROUP BY ROLLUP (col 2, col 1) 효과
2. 실제 사례
우 리 는 지금 오 라 클 9i 의 통계 예 시 를 살 펴 보 겠 습 니 다. 예 시 는 다음 과 같 습 니 다.
2.1 통계 요구
각 담뱃잎 등급 의 2 차 검사 급 의 원 발 건수, 원 발 중량 과 검수 중량 에 관 한 통계 보고 서 를 개발 하 다.그 중에서 원 발 건수, 원 발 중량 과 검수 중량 등 열 은 각 등급 의 조별 소계 와 모든 기록 의 합 계 를 계산 해 야 한다.
2.2. 우리 의 일반적인 방법
1. 아래 의 SQL 로 초보적인 데이터 세트 를 통계 한다.
SELECT T1.TOBACCO_CLASS_NAME,
T4.TOBACCO_CLASS_TYPE,
NVL(SUM(T1.ORG_PIECE), 0)TOTAL_ORG_PIECE,
NVL(SUM(T1.ORG_WEIGHT), 0)TOTAL_ORG_WEIGHT,
NVL(SUM(T1.AMOUNT), 0)TOTAL_AMOUNT
FROM VI_FK_BALANCE_DETAIL T1, TB_TOBACCO_CLASS T4
WHERE T1.TOBACCO_CLASS_ID=T4.TOBACCO_CLASS_ID
AND T1.ACCOUNT_YEAR=T4.ACCOUNT_YEAR
AND T4.DEL_FLAG=0
AND T4.ENABLE_FLAG=0
AND T1.REC_DATE > TO_DATE(‘2006-11-05’, ‘YYYY-MM-DD’
GROUP BY T4.TOBACCO_CLASS_TYPE,T1.TOBACCO_CLASS_NAME
ORDER BY T4.TOBACCO_CLASS_TYPE
조회 결 과 는 아래 표 와 같다.
담뱃잎 등급
등급 그룹 별
원 발 건수
원 발 무게
중량 을 검수 하 다
(B1F) 오렌지 1.
51
4945
197800
197508.1
(B2F) 오렌지 2
51
8335
333400
332316.9
(C1F) 중 귤 1
51
694
27760
27610.54
(C2F) 중 귤 2
51
803
32120
31650.4
(C3F) 중 귤 3
51
6381
255240
255372.6
(X1F) 오렌지 1
51
75
3000
3012.2
(B3F) 귤 세 개.
52
4701
188040
187389.9
(B4F) 귤 4 올 리 기
52
122
4880
4866.81
(C3V) 중 미 청 삼
52
174
6960
6934.06
(C4F) 중 귤 4
52
4639
185560
185276.4
(X2F) 오렌지 2
52
1739
69560
69029.79
(X2V) 하 미 청 2
52
26
1040
1038.34
(X3F) 오렌지 3
52
1263
50520
50439.86
(X4F) 오렌지 4
53
102
4080
4075.62
(B3K) 에 셋 이 섞 여 있다.
54
0
0
249.39
2. 프로그램 에서 검색 한 데이터 세트 를 처리 하 는 방법 을 작성 합 니 다. 데이터 세트 를 처리 하 는 방법 에 중점 을 두 지 않 기 때문에 해당 하 는 방법 은 생략 합 니 다.
2.3. SQL 로 직접 실현 하 는 방법
SELECT
DECODE(
GROUPING(T4.TOBACCO_CLASS_TYPE) +
GROUPING(T1.TOBACCO_CLASS_NAME),
1,
DECODE(T4.TOBACCO_TYPE,
51, ‘
고급 담배 소계
52, ‘
중간 담배 소계
53, ‘
하등 담배 소계
54, ‘
하등 담배 소계

소계
2,

합계
T1.TOBACCO_CLASS_NAME
)TOBACCO_CLASS_NAME,
T4.TOBACCO_CLASS_TYPE,
NVL(
SUM(T1.ORG_PIECE),0)TOTAL_ORG_PIECE,
NVL(
SUM(T1.ORG_WEIGHT), 0)TOTAL_ORG_WEIGHT,
NVL(
SUM(T1.AMOUNT), 0)TOTAL_AMOUNT
FROMVI_FK_BALANCE_DETAIL T1, TB_TOBACCO_CLASS T4
WHERE T1.TOBACCO_CLASS_ID=T4.TOBACCO_CLASS_ID
AND T1.ACCOUNT_YEAR=T4.ACCOUNT_YEAR
AND T4.DEL_FLAG=0
AND T4.ENABLE_FLAG=0
AND T1.REC_DATE > TO_DATE(‘
2006-11-05’, ‘
YYYY-MM-DD’
GROUP BY
ROLLUP( T4.TOBACCO_CLASS_TYPE,T1.TOBACCO_CLASS_NAME)
ORDER BY T4.TOBACCO_CLASS_TYPE
조 회 를 통 해 통계 결 과 는 다음 표 에서 보 듯 이 이 표 의 통계 결 과 는 이미 통계 요 구 를 만족 시 켰 다.
담뱃잎 등급
등급 그룹 별
원 발 건수
원 발 무게
중량 을 검수 하 다
(B1F) 오렌지 1.
51
4945
197800
197508.1
(B2F) 오렌지 2
51
8335
333400
332316.9
(C1F) 중 귤 1
51
694
27760
27610.54
(C2F) 중 귤 2
51
803
32120
31650.4
(C3F) 중 귤 3
51
6381
255240
255372.6
(X1F) 오렌지 1
51
75
3000
3012.2
고급 담배 소계
51
21233
849320
847470.8
(B3F) 귤 세 개.
52
4701
188040
187389.9
(B4F) 귤 4 올 리 기
52
122
4880
4866.81
(C3V) 중 미 청 삼
52
174
6960
6934.06
(C4F) 중 귤 4
52
4639
185560
185276.4
(X2F) 오렌지 2
52
1739
69560
69029.79
(X2V) 하 미 청 2
52
26
1040
1038.34
(X3F) 오렌지 3
52
1263
50520
50439.86
중간 담배 소계
52
12664
506560
504975.1
(X4F) 오렌지 4
53
102
4080
4075.62
하등 담배 소계
53
102
4080
4075.62
(B3K) 에 셋 이 섞 여 있다.
54
0
0
249.39
하등 담배 소계
54
0
0
249.39
합계 하 다
33999
1359960
1356771
비 교 를 통 해 여러분 도 후자 의 독특한 매력 을 느 낄 수 있 을 것 이 라 고 믿 습 니 다. 적어도 저 는 데이터 세트 처리 에 대해 소계 행 을 얻 는 방법 을 쓸 때 복잡 하 지 는 않 지만 번 거 로 운 것 이 라 고 느 꼈 습 니 다. SQL 에서 소계 행 을 직접 실현 하 는 것 보다 훨씬 멋 지고 간결 하 다 고 느 꼈 습 니 다.

좋은 웹페이지 즐겨찾기