관리 메뉴

nalaolla

compute와 rollup의차이점 본문

MS-SQL

compute와 rollup의차이점

날아올라↗↗ 2015. 12. 20. 13:36
728x90
반응형

8. GROUP BY, COMPUTE BY, ROLLUP, CUBE를 이용한 

    요약 데이터 작성

 

이번에 소개해 드릴 내용은 요약 데이터를 작성하자 라는 의미 입니다.

먼저 이곳을 보시기 전에 설명 드린 함수의

Aggregate 함수 부분을 찬찬히 다시 함 봐 보시길 바랍니다.

이를 보통 계산 함수라 부르는데요...

이 계산함수와 group by가 함께 사용이 된답니다.

먼저 간단한 쿼리를 살펴 보도록 하지요.

 

코난이를 책회사의 사장이라고 생각해 보세요... ^_^

책회사가 생긴지는 어언 1년이 다 되어 갑니다.....

그동안 만든 책도 많았습니다....

요리책.., 컴퓨터 책...., 비즈니스에 대한 책...... , 정신세계에 대한책....

흐흐흐.... 근데.. 최근들어 의문이 생긴 겁니다....

도대체 내가 어떤책을 얼마나많은 양을 얼마를 주고 판거지????

저자와. 로열티와.. 팔린수.... 흠흠흠... 책의 가격은.....

궁금하구먼......

평소 MSSQL서버에 관심이 많던 코난이가 컴앞에 앉아 질의를 만듭니다..

흠흠흠.... 일케 하면???

 

 

USE pubs

select pub_id 저자, type 책종류, royalty 로열티, ytd_sales 팔린수 from titles

 

자 이런 쿼리를 돌려 보시면?

아마도 결과는..

저자 책종류 로열티 팔린수 
---- ------------ ----------- ----------- 
1389 business 10 4095
1389 business 10 3876
0736 business 24 18722
1389 business 10 4095
0877 mod_cook 12 2032
0877 mod_cook 24 22246
0877 UNDECIDED NULL NULL
1389 popular_comp 16 8780
1389 popular_comp 10 4095
1389 popular_comp NULL NULL
0877 psychology 10 375
0736 psychology 12 2045
0736 psychology 10 111
0736 psychology 10 4072
0736 psychology 10 3336
0877 trad_cook 10 375
0877 trad_cook 14 15096
0877 trad_cook 10 4095

(18개 행 적용됨)

흠흠흠... 그러쿠먼... 흠흠흠........

음..........

이걸 그룹핑을 시켜서 보면 좀더 '정리된 자룔 볼 수 있지 않을강?'

흠흠흠....

저자명과 책종류와 로열티와 팔린수 평균값의 순으로 그룹핑을 시킴 보기 좋겠구먼...

 

select pub_id 저자, type 책종류, royalty 로열티, ytd_sales 팔린수, AVG(price) 평균값
from titles
GROUP BY pub_id, type, royalty, ytd_sales

 

저자 책종류 로열티 팔린수 평균값 
---- ------------ ----------- ----------- --------------------- 
0736 business 24 18722 2.9900
0736 psychology 10 111 7.0000
0736 psychology 10 3336 7.9900
0736 psychology 10 4072 19.9900
0736 psychology 12 2045 10.9500
0877 mod_cook 12 2032 19.9900
0877 mod_cook 24 22246 2.9900
0877 psychology 10 375 21.5900
0877 trad_cook 10 375 20.9500
0877 trad_cook 10 4095 14.9900
0877 trad_cook 14 15096 11.9500
0877 UNDECIDED NULL NULL NULL
1389 business 10 3876 11.9500
1389 business 10 4095 19.9900
1389 popular_comp NULL NULL NULL
1389 popular_comp 10 4095 20.0000
1389 popular_comp 16 8780 22.9500

(17개 행 적용됨)


경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.

 

 자 어떠세요? 이런 경우가 있겠지요? 조금 쉽게 더 생각해 보도록 하지요.

 

select pub_id 저자, type 책종류, price 평균값
from titles

 

저자 책종류 평균값 
---- ------------ --------------------- 
1389 business 19.9900
1389 business 11.9500
0736 business 2.9900
1389 business 19.9900
0877 mod_cook 19.9900
0877 mod_cook 2.9900
0877 UNDECIDED NULL
1389 popular_comp 22.9500
1389 popular_comp 20.0000
1389 popular_comp NULL
0877 psychology 21.5900
0736 psychology 10.9500
0736 psychology 7.0000
0736 psychology 19.9900
0736 psychology 7.9900
0877 trad_cook 20.9500
0877 trad_cook 11.9500
0877 trad_cook 14.9900

(18개 행 적용됨)


이런 데이터가 있다고 할때요...

책 종류별로 팔린 SUM 가격 값을 알고 싶다면? 어떻게 할까요?

중요한 포인트는 책 종류별 입니다.

 

select type 책종류, sum(price) 평균값
from titles
group by type

 

책종류 평균값 
------------ --------------------- 
business 54.9200
mod_cook 22.9800
popular_comp 42.9500
psychology 67.5200
trad_cook 47.8900
UNDECIDED NULL

(6개 행 적용됨)

경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.

 

맨 아래의 경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.는?

그렇군.!!!! 책값중에 아직 책의 가격이 책정 안된게(가격이 NULL인게) 있군!!!!

이것을 무시하고 계산한다.. 라는 의미구먼..... ^_^

 

이런식이 되는 것이지요? 조금 보이시나요? 보시는 바와 같이 

책 종류별로 어떠한 집계 결과(지금은 SUM에 의한 총합)를 얻게 되었습니다.

 

이 GROUP BY에 대해 조금더 깊이 생각해 볼까요?

GROUP BY / HAVING

계산 함수와 함께 각 그룹에 대해 하나의 행과 하나의 요약 정보를 생성한다.

        SELECT select_list

        FROM table_name

        WHERE search_conditions

        GROUP BY [ALL] aggregate_free_expression

                                [, aggregate_free_expression…]]

        [HAVING search conditions]

        - GROUP BY

          - 선택된 테이블의 각 그룹에 대한 요약 정보를 생성한다.

        - HAVING

          - 결과 행들에 대해 제약을 가한다.

          - 조건에 맞지 않는 그룹들을 제외한다.

 

ANSI 표준 SQL에서의 요구사항

        - select_list에 있는 모든 컬럼들은 반드시 GROUP BY 절에 나타나야 한다.

        - HAVING 절에 있는 컬럼은 반드시 하나의 값을 반환해야 한다.

        - HAVING절을 포함한 질의는 반드시 GROUP BY 절을 포함해야 한다.

 

Transact - SQL에서는 ANSI 표준 SQL보다 많은 옵션을 제공한다.

        - GROUP BY 절은 수식을 포함할 수 있다.

        - GROUP BY ALL은 WHERE절에서 제외된 그룹까지도 포함한다.

        - ALL은 SELECT 문이 WHERE 절을 포함할 때만 의미가 있다.

 

몇개의 샘플을 더 보여 드리면?

 

SELECT title_id, copies_sold = SUM(qty)
FROM sales
GROUP BY title_id

 

이 샘플은? title_id 별로 팔린수라는 값을 보여주는 샘플 이겠지요?

 

여기서 HAVING 이라는 말이 나오는데 이는 뭘까요?

 

SELECT title_id, copies_sold = SUM(qty)
FROM sales
GROUP BY title_id
HAVING SUM(qty) > 20

 

이렇게 HAVING은? 그룹화된 데이터들에 대해 조건을 줄 수 있다는 것입니다.

말로 풀어 본다면? SUM(qty) 값이 20 보다 큰 그룹화된 녀석들만 보여줘!!

라는 질의가 되겠지요. ^_^

 

그렇다면? GROUP BY ALL 은 무엇 일까요?

 

SELECT title_id, copies_sold = SUM(qty)
FROM sales
WHERE ord_date BETWEEN '1/1/1994' AND '12/31/1994'
GROUP BY ALL title_id

 

결과를 실행해 보시면? 조건에 맞지 않는 title_id라도 우선은 보여 준다는

의미 입니다. 집계 결과는 NULL로 표기 하지만 그룹의 리스트는 보여 준다는

의미 이지요. 

 

다음으로 ROLLUP / CUBE에 대해서 조금더 알려 드릴 시간 이군요.

위의 코난이가 책가게 사장이라는 상황의 계속 입니다.

 

흠.....

헌데.. 몬가 부족한 듯 하구먼.............

흠흠흠....

흠흠...

저자별로..... 거기에 각각의 잭종류 별로 로열티 별로 볼 수는 없을가...

흠흠흠.. 저 0376같은 저자를 보니... 사업과 정신세계에 대한 책을 썼는데...

각각에대해 좀더 자세한 값을 보고 싶구먼.. 흠흠흠....

 

select pub_id 저자, type 책종류, royalty 로열티, ytd_sales 팔린수, AVG(price) 평균값
from titles
GROUP BY pub_id, type, royalty, ytd_sales
WITH ROLLUP

 

 

저자 책종류 로열티 팔린수 평균값 
---- ------------ ----------- ----------- --------------------- 
0736 business 24 18722 2.9900
0736 business 24 NULL 2.9900
0736 business NULL NULL 2.9900
0736 psychology 10 111 7.0000
0736 psychology 10 3336 7.9900
0736 psychology 10 4072 19.9900
0736 psychology 10 NULL 11.6600
0736 psychology 12 2045 10.9500
0736 psychology 12 NULL 10.9500
0736 psychology NULL NULL 11.4825
0736 NULL NULL NULL 9.7840
0877 mod_cook 12 2032 19.9900
0877 mod_cook 12 NULL 19.9900
0877 mod_cook 24 22246 2.9900
0877 mod_cook 24 NULL 2.9900
0877 mod_cook NULL NULL 11.4900
0877 psychology 10 375 21.5900
0877 psychology 10 NULL 21.5900
0877 psychology NULL NULL 21.5900
0877 trad_cook 10 375 20.9500
0877 trad_cook 10 4095 14.9900
0877 trad_cook 10 NULL 17.9700
0877 trad_cook 14 15096 11.9500
0877 trad_cook 14 NULL 11.9500
0877 trad_cook NULL NULL 15.9633
0877 UNDECIDED NULL NULL NULL
0877 UNDECIDED NULL NULL NULL
0877 UNDECIDED NULL NULL NULL
0877 NULL NULL NULL 15.4100
1389 business 10 3876 11.9500
1389 business 10 4095 19.9900
1389 business 10 NULL 17.3100
1389 business NULL NULL 17.3100
1389 popular_comp NULL NULL NULL
1389 popular_comp NULL NULL NULL
1389 popular_comp 10 4095 20.0000
1389 popular_comp 10 NULL 20.0000
1389 popular_comp 16 8780 22.9500
1389 popular_comp 16 NULL 22.9500
1389 popular_comp NULL NULL 21.4750
1389 NULL NULL NULL 18.9760
NULL NULL NULL NULL 14.7662

(42개 행 적용됨)

경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.

 

 

흠... 저 결과의 두 번째줄의 NULL과 같은 저 값은 무얼가????

아항~~~ 바로 총합일 경우구먼!!!!!!

그럼 결과 맨 밑줄의 다 널인놈은?

아하~~~ 모든책 저자, 종류에 대한~~~  총 평균을 말하는군!!!!

 흠흠흠 (뿌듯~~~) 좋구먼... ^_^ 흠~~~~~~~

각각의 저자별로 책종류 별로... 로열티 별로.. 팔린수 별로 아주 자세히 보이는 구먼...

근데...

각각의 저자별이 아닌 책종류가 중요한데...

그렇쿠먼!!! 일케함 되겠구먼!!!!!!

 

select type 책종류,pub_id 저자, royalty 로열티, ytd_sales 팔린수, AVG(price) 평균값
from titles
GROUP BY type,pub_id, royalty, ytd_sales
WITH ROLLUP

 

책종류 저자 로열티 팔린수 평균값 
------------ ---- ----------- ----------- --------------------- 
business 0736 24 18722 2.9900
business 0736 24 NULL 2.9900
business 0736 NULL NULL 2.9900
business 1389 10 3876 11.9500
business 1389 10 4095 19.9900
business 1389 10 NULL 17.3100
business 1389 NULL NULL 17.3100
business NULL NULL NULL 13.7300
mod_cook 0877 12 2032 19.9900
mod_cook 0877 12 NULL 19.9900
mod_cook 0877 24 22246 2.9900
mod_cook 0877 24 NULL 2.9900
mod_cook 0877 NULL NULL 11.4900
mod_cook NULL NULL NULL 11.4900
popular_comp 1389 NULL NULL NULL
popular_comp 1389 NULL NULL NULL
popular_comp 1389 10 4095 20.0000
popular_comp 1389 10 NULL 20.0000
popular_comp 1389 16 8780 22.9500
popular_comp 1389 16 NULL 22.9500
popular_comp 1389 NULL NULL 21.4750
popular_comp NULL NULL NULL 21.4750
psychology 0736 10 111 7.0000
psychology 0736 10 3336 7.9900
psychology 0736 10 4072 19.9900
psychology 0736 10 NULL 11.6600
psychology 0736 12 2045 10.9500
psychology 0736 12 NULL 10.9500
psychology 0736 NULL NULL 11.4825
psychology 0877 10 375 21.5900
psychology 0877 10 NULL 21.5900
psychology 0877 NULL NULL 21.5900
psychology NULL NULL NULL 13.5040
trad_cook 0877 10 375 20.9500
trad_cook 0877 10 4095 14.9900
trad_cook 0877 10 NULL 17.9700
trad_cook 0877 14 15096 11.9500
trad_cook 0877 14 NULL 11.9500
trad_cook 0877 NULL NULL 15.9633
trad_cook NULL NULL NULL 15.9633
UNDECIDED 0877 NULL NULL NULL
UNDECIDED 0877 NULL NULL NULL
UNDECIDED 0877 NULL NULL NULL
UNDECIDED NULL NULL NULL NULL
NULL NULL NULL NULL 14.7662

(45개 행 적용됨)


경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.

흠하하하~~~ 아주아주 좋은 자료군~~~ 이렇게 조은 명령이 있어 세세히

모든 자료를 들여다 볼 수 있으니.. 호오~~~ 죽이는구먼~~~~ 핫핫핫~~~~

 

그런데... 지금처럼... 저자별 각각의 책의 종류와....

종류별 각각의 책의 저자의 평균값을 동시에 볼 수는 없을가???????

조금 길어질 것도 같지만...

음.. 이게 좋겠군....

 

 

SELECT pub_id 저자, type 책종류, royalty 로열티, ytd_sales 팔린수, AVG(price) 평균값
FROM titles
GROUP BY pub_id, type, royalty, ytd_sales
WITH CUBE

 

저자 책종류 로열티 팔린수 평균값 
---- ------------ ----------- ----------- --------------------- 
0736 business 24 18722 2.9900
0736 business 24 NULL 2.9900
0736 business NULL NULL 2.9900
0736 psychology 10 111 7.0000
0736 psychology 10 3336 7.9900
0736 psychology 10 4072 19.9900
0736 psychology 10 NULL 11.6600
0736 psychology 12 2045 10.9500
0736 psychology 12 NULL 10.9500
0736 psychology NULL NULL 11.4825
0736 NULL NULL NULL 9.7840
0877 mod_cook 12 2032 19.9900
0877 mod_cook 12 NULL 19.9900
0877 mod_cook 24 22246 2.9900
0877 mod_cook 24 NULL 2.9900
0877 mod_cook NULL NULL 11.4900
0877 psychology 10 375 21.5900
0877 psychology 10 NULL 21.5900
0877 psychology NULL NULL 21.5900
0877 trad_cook 10 375 20.9500
0877 trad_cook 10 4095 14.9900
0877 trad_cook 10 NULL 17.9700
0877 trad_cook 14 15096 11.9500
0877 trad_cook 14 NULL 11.9500
0877 trad_cook NULL NULL 15.9633
0877 UNDECIDED NULL NULL NULL
0877 UNDECIDED NULL NULL NULL
0877 UNDECIDED NULL NULL NULL
0877 NULL NULL NULL 15.4100
1389 business 10 3876 11.9500
1389 business 10 4095 19.9900
1389 business 10 NULL 17.3100
1389 business NULL NULL 17.3100
1389 popular_comp NULL NULL NULL
1389 popular_comp NULL NULL NULL
1389 popular_comp 10 4095 20.0000
1389 popular_comp 10 NULL 20.0000
1389 popular_comp 16 8780 22.9500
1389 popular_comp 16 NULL 22.9500
1389 popular_comp NULL NULL 21.4750
1389 NULL NULL NULL 18.9760
NULL NULL NULL NULL 14.7662
NULL business 10 3876 11.9500
NULL business 10 4095 19.9900
NULL business 10 NULL 17.3100
NULL business 24 18722 2.9900
NULL business 24 NULL 2.9900
NULL business NULL NULL 13.7300
NULL mod_cook 12 2032 19.9900
NULL mod_cook 12 NULL 19.9900
NULL mod_cook 24 22246 2.9900
NULL mod_cook 24 NULL 2.9900
NULL mod_cook NULL NULL 11.4900
NULL popular_comp NULL NULL NULL
NULL popular_comp NULL NULL NULL
NULL popular_comp 10 4095 20.0000
NULL popular_comp 10 NULL 20.0000
NULL popular_comp 16 8780 22.9500
NULL popular_comp 16 NULL 22.9500
NULL popular_comp NULL NULL 21.4750
NULL psychology 10 111 7.0000
NULL psychology 10 375 21.5900
NULL psychology 10 3336 7.9900
NULL psychology 10 4072 19.9900
NULL psychology 10 NULL 14.1425
NULL psychology 12 2045 10.9500
NULL psychology 12 NULL 10.9500
NULL psychology NULL NULL 13.5040
NULL trad_cook 10 375 20.9500
NULL trad_cook 10 4095 14.9900
NULL trad_cook 10 NULL 17.9700
NULL trad_cook 14 15096 11.9500
NULL trad_cook 14 NULL 11.9500
NULL trad_cook NULL NULL 15.9633
NULL UNDECIDED NULL NULL NULL
NULL UNDECIDED NULL NULL NULL
NULL UNDECIDED NULL NULL NULL
0877 NULL NULL NULL NULL
1389 NULL NULL NULL NULL
NULL NULL NULL NULL NULL
NULL NULL NULL NULL NULL
0736 NULL 10 111 7.0000
NULL NULL 10 111 7.0000
0877 NULL 10 375 21.2700
NULL NULL 10 375 21.2700
0736 NULL 10 3336 7.9900
NULL NULL 10 3336 7.9900
1389 NULL 10 3876 11.9500
NULL NULL 10 3876 11.9500
0736 NULL 10 4072 19.9900
NULL NULL 10 4072 19.9900
0877 NULL 10 4095 14.9900
1389 NULL 10 4095 19.9933
NULL NULL 10 4095 18.7425
NULL NULL 10 NULL 16.4440
0877 NULL 12 2032 19.9900
NULL NULL 12 2032 19.9900
0736 NULL 12 2045 10.9500
NULL NULL 12 2045 10.9500
NULL NULL 12 NULL 15.4700
0877 NULL 14 15096 11.9500
NULL NULL 14 15096 11.9500
NULL NULL 14 NULL 11.9500
1389 NULL 16 8780 22.9500
NULL NULL 16 8780 22.9500
NULL NULL 16 NULL 22.9500
0736 NULL 24 18722 2.9900
NULL NULL 24 18722 2.9900
0877 NULL 24 22246 2.9900
NULL NULL 24 22246 2.9900
NULL NULL 24 NULL 2.9900
0877 UNDECIDED NULL NULL NULL
0877 NULL NULL NULL NULL
1389 popular_comp NULL NULL NULL
1389 NULL NULL NULL NULL
NULL NULL NULL NULL NULL
0736 psychology NULL 111 7.0000
0736 NULL NULL 111 7.0000
NULL NULL NULL 111 7.0000
0877 psychology NULL 375 21.5900
0877 trad_cook NULL 375 20.9500
0877 NULL NULL 375 21.2700
NULL NULL NULL 375 21.2700
0877 mod_cook NULL 2032 19.9900
0877 NULL NULL 2032 19.9900
NULL NULL NULL 2032 19.9900
0736 psychology NULL 2045 10.9500
0736 NULL NULL 2045 10.9500
NULL NULL NULL 2045 10.9500
0736 psychology NULL 3336 7.9900
0736 NULL NULL 3336 7.9900
NULL NULL NULL 3336 7.9900
1389 business NULL 3876 11.9500
1389 NULL NULL 3876 11.9500
NULL NULL NULL 3876 11.9500
0736 psychology NULL 4072 19.9900
0736 NULL NULL 4072 19.9900
NULL NULL NULL 4072 19.9900
0877 trad_cook NULL 4095 14.9900
0877 NULL NULL 4095 14.9900
1389 business NULL 4095 19.9900
1389 popular_comp NULL 4095 20.0000
1389 NULL NULL 4095 19.9933
NULL NULL NULL 4095 18.7425
1389 popular_comp NULL 8780 22.9500
1389 NULL NULL 8780 22.9500
NULL NULL NULL 8780 22.9500
0877 trad_cook NULL 15096 11.9500
0877 NULL NULL 15096 11.9500
NULL NULL NULL 15096 11.9500
0736 business NULL 18722 2.9900
0736 NULL NULL 18722 2.9900
NULL NULL NULL 18722 2.9900
0877 mod_cook NULL 22246 2.9900
0877 NULL NULL 22246 2.9900
NULL NULL NULL 22246 2.9900
0877 NULL NULL NULL NULL
1389 NULL NULL NULL NULL
0736 NULL 10 NULL 11.6600
0877 NULL 10 NULL 19.1766
1389 NULL 10 NULL 17.9825
0736 NULL 12 NULL 10.9500
0877 NULL 12 NULL 19.9900
0877 NULL 14 NULL 11.9500
1389 NULL 16 NULL 22.9500
0736 NULL 24 NULL 2.9900
0877 NULL 24 NULL 2.9900
NULL popular_comp NULL NULL NULL
NULL UNDECIDED NULL NULL NULL
NULL psychology NULL 111 7.0000
NULL psychology NULL 375 21.5900
NULL trad_cook NULL 375 20.9500
NULL mod_cook NULL 2032 19.9900
NULL psychology NULL 2045 10.9500
NULL psychology NULL 3336 7.9900
NULL business NULL 3876 11.9500
NULL psychology NULL 4072 19.9900
NULL business NULL 4095 19.9900
NULL popular_comp NULL 4095 20.0000
NULL trad_cook NULL 4095 14.9900
NULL popular_comp NULL 8780 22.9500
NULL trad_cook NULL 15096 11.9500
NULL business NULL 18722 2.9900
NULL mod_cook NULL 22246 2.9900

(184개 행 적용됨)

경고: 집계 또는 다른 집합 연산에 의해 Null 값이 제거되었습니다.

자 이렇게 지금까지 보신 내용이? ROLLUP과 CUBE에 대한 샘플 이었습니다.

조금더 내부적으로 알아 볼까요?

 

ROLLUP / CUBE 연산자

지정된 컬럼들에 대한 다양한 조합을 고려하는 데이타 요약의 필요성이 나타나게 되었다.

        - data warehousing

        - DSS(decision support system)

        - OLAP(online analytic processing)…

계산함수와 함께 사용되어 결과에 추가적인 행을 만든다.

        GROUP BY [ALL] aggregate_free_expression

                        [, aggregate_free_expression…]

                        [WITH{CUBE | ROLLUP}]

 

ROLLUP 연산자

- GROUP BY 절에 있는 컬럼들의 오른쪽에서 왼쪽의 차례로 그룹들을 생성하고 

   각 그룹에 계산 함수를 적용한다.

- GROUP BY 절의 결과는 누적 계산 결과이다.

CUBE 연산자

- GROUP BY 절에 있는 모든 컬럼들에 대한 가능한 모든 조합을 그룹으로 생성한다.

 

고려사항

        - 최대 10 그룹의 표현식이 지정될 수 있다

        - 일반적인 GROUP BY 의 경우는 16 그룹의 표현식을 허용한다.

        - 컬럼이나 표현식을 명시적으로 GROUP BY에 지정할 수 없다.

        - GROUP BY 절에 나타나는 컬럼들의 최대 크기는 900바이트 이다.

 

다음은 GROUPING 함수에 대한 이야깁니다.

 

SELECT royalty, SUM(advance) 'total advance', 
GROUPING(royalty) 'grp'
FROM titles
GROUP BY royalty WITH ROLLUP

 

크게 중요한 내용은 아닙니다만..

GROUPING 함수

각 결과 행이 CUBE, ROLLUP 연산자들에 의해 계산된 것인지를 알기 위해 사용된다

GROUPING(column_name)

  - 각 행에 결과 값을 위한 새로운 컬름을 추가하여 어느 것에 의해 계산 되었는지를 나타낸다.

  - GROUP BY 절에 나타나는 컬럼에 적용된다.

 

 

어떠신지요? 조금은 복잡한 내용 이었지요?

지금까지의 내용은 GROUP BY와 ROLLUP CUBE에 대한 내용이었습니다.

이제 보실 내용은?

COMPUTE BY라는 다른 녀석 입니다.

 

SELECT type, price FROM titles
WHERE type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price)

 

이녀석은 큰 설명이 필요 없습니다. 실행해 보시면? 어떤 녀석인지 감이

팍 잡히실 겁니다.

바로 요약 데이터를 작성하는 녀석 이지요 결과는

type price 
------------ --------------------- 
mod_cook 2.9900
mod_cook 19.9900
trad_cook 11.9500
trad_cook 14.9900
trad_cook 20.9500

sum
===================
70.8700


(6개 행 적용됨)


이런 식이 되실 겁니다 글치요?

다음은? COMPUTE BY 샘플 입니다.

 


SELECT type, price FROM titles
WHERE type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price) BY type

 

해당하는 질의와 다른점은?

type price 
------------ --------------------- 
mod_cook 2.9900
mod_cook 19.9900

sum
===================
22.9800


type price 
------------ --------------------- 
trad_cook 11.9500
trad_cook 14.9900
trad_cook 20.9500

sum
===================
47.8900


(7개 행 적용됨)

모가 다른듯 하신가요?

바로 type별로 나뉘어진 요약 결과라는 점이지요.

 

조금더 재미있는 샘플을 알아 본다면?

 

SELECT type, price FROM titles
WHERE type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price) BY type
COMPUTE SUM(price)

 

이런 질의를 날려 볼까요?

결과는?

type price 
------------ --------------------- 
mod_cook 2.9900
mod_cook 19.9900

sum
===================
22.9800


type price 
------------ --------------------- 
trad_cook 11.9500
trad_cook 14.9900
trad_cook 20.9500

sum
===================
47.8900


sum
===================
70.8700


(8개 행 적용됨)


이런 식이 되실 겁니다.

하나는 COMPUTE BY 이고.. 또하나는 COMPUTE 인데 맨 마지막에

결과가 하나 추가 되지요? 그럼 제대로 보신 겁니다.

자..  좀더 상세히 이 COMPUTE BY를 알아 보도록 하지요.

COMPUTE / COMPUTE BY

계산 함수를 이용하여 질의 결과로 부터 요약 행을 생성한다.

COMPUTE row_aggregate(column_name)

               [, row_aggregate(column_name)…]

    [BY column_name [,column_name]…]

- COMPUTE BY

- 그룹별로 요약 정보를 생성한다.

- 상세 행과  요약행을 한꺼번에 작성할 수 있다.

- 일반적으로 기본키와 참조키 값에 의해 정렬된 행들에 대해 

   요약 보고서를 작성하는데 사용된다.

 

제약 사항

    - DISTINCT 키워드는 행 계산 함수와 함께 사용할 수 없다.

    - COMPUTE 절에 있는 컬럼은 반드시 select_list에 나타나야 한다.

    - SELECT INTO는 COMPUTE절과 함께 사용할 수 없다.

      - COMPUTE를 포함하고 있는 문장은 Non-relational 결과를 생성하므로

    - COMPUTE BY 절에 컬럼 이름이나 수식을 사용해야 한다.

    - COMPUTE BY 는 반드시 ORDER BY와 함께 사용해야 한다.

      - COMPUTE키워드는 ORDER BY없이 자체적으로 사용될 수 없다.

    - COMPUTE BY 절에 나타나는 컬럼들은 ORDER BY 절에 나타나는 컬럼들과 같거나 

        그 일부분 이어야 한다.

      - 이때 컬럼들의 순서도 일치해야 하며 ORDER BY 절에 나타나는 표현식은 

        반드시 나타나야 한다.

    - 텍스트나 이미지 자료형은 COMPUTE 절에 포함 시킬 수 없다.

 

ORDER BY와 COMPUTE BY

        ORDER BY a,  b,  c

        - 올바르게 작성된 COMPUTE BY 절

          COMPUTE row_aggregate (column_name) BY a, b, c

          COMPUTE row_aggregate (column_name) BY a, b

          COMPUTE row_aggregate (column_name) BY a

        - 잘못 작성된 COMPUTE BY절

          COMPUTE row_aggregate (column_name) BY b, c

          COMPUTE row_aggregate (column_name) BY a, c

          COMPUTE row_aggregate (column_name) BY c

          COMPUTE row_aggregate (column_name) BY b

 

 

 

--잘못된 COMPUTE BY 절

SELECT type, price FROM titles
WHERE type LIKE '%cook'
ORDER BY type, price
COMPUTE SUM(price), SUM(advance) BY type
COMPUTE SUM(price), SUM(advance)

 

결과 :

서버: 메시지 411, 수준 16, 상태 2, 줄 1
COMPUTE 절 #1, 집계 식 #2이(가) SELECT 목록에 없습니다.
서버: 메시지 411, 수준 16, 상태 1, 줄 1
COMPUTE 절 #2, 집계 식 #2이(가) SELECT 목록에 없습니다.

 

자 끝으로요..

조금 복잡 하지요? 특히나 ROLLUP , CUBE요..   ^_^;;

그렇다면... "그눔의 복잡 그지없는 ROLLUP / CUBE는 왜 있냐?"

"전들 압니가?" 라고 말한다면 강좌를 하는 저에게 돌을 떤지실분 무지 많겠죠.. -.-;;

최근의 생활과 인터넷이라는 매체를 생각해 보죠....

첨 R-DB가 개발 된게 70년 중반이랍니다...

그리고 20년도 넘게 흘러서....

DB에 이 복잡 그지없는 "생활" , "인터넷상의 떠도는 모든 이미지, 동영상, ..."

게다가.... 데이터웨어 하우징, 전사적 자원관리, 지식 관리 시스템..... 등등등....

단 한줄의 자료... 예를 들면......

"코난이는 다리도 길고 잘생겼다.." (-_-+ 거기 그냥돌도 아닌 짱돌 던진분 누구신가요... -.-+)

라는 한줄의 자료로.......   실로 책한권 분량의 자료를 분석해내야 할 때가 된거지요..

코난이의 다리는 기니까.. 키는 180이상이고... 잘생겼다는걸 보니... 왕자병인지... 사실인지..

알 도리가 없으며..... ......................................................................."

 

라는 방식이 필요해진겁니다.

그래서 희한한? ROLLUPP / CUBE 라는 연산자가 생기는 거지요....

이 ROLLUP과 CUBE는 SQL2000의 analysis 서비스를 사용하기 위한 기본적인

질의 입니다. 추후 데이터 웨어 하우징과 데이터 마이닝을 사용하기위한

초석이 되는 T-SQL 연산자라는 의미 이지요.

이개념을 잘 잡으시면? 추후의 analysis 서비스 강좌에서 큰 무리 없으실 겁니다.

수고 하셨습니다.


728x90
반응형

'MS-SQL' 카테고리의 다른 글

거리계산  (0) 2015.12.20
MSSQL 메뉴 활성화 바로 가기 키  (0) 2015.12.20
[MS-SQL] ROLLUP 과 CUBE 의 차이  (0) 2015.12.20
ROLLUP과 CUBE 정의  (0) 2015.12.20
일,주,월,분기별 통계  (0) 2015.12.20