본문 바로가기

IT Story/SQL Story

SQL 함수: 집계 함수

합계, 평균, 최대, 최소, 중간, 표준편차 함수

 

조건에 맞는 데이터 개수 세기: COUNT, COUNT_BIG 함수

COUNT_BIG : 데이터 개수가 21억 개를 초과할 때

 

SELECT COUNT(*) FROM nasdaq_company

결과

8918

 

nasdaq_company 테이블에서 ipo_year열 기준으로 그룹화해서 각 ipo_year 그룹에 몇 건의 데이터가 있는지 확인

SELECT ipo_year, COUNT(*) FROM nasdaq_company

Group By ipo_year 

Order By ipo_year

결과

ipo_year           (열 이름 없음)
NULL                      4
0                             859
1970                      29
1971                      1
1972                      19
1973                      121

 

nasdaq_company 테이블에서 ipo_year열과 sector 열 기준으로 그룹화해서 각 ipo_year 그룹에 몇 건의 데이터가 있는지 확인

SELECT ipo_year, sector, COUNT(*) FROM nasdaq_company

Group By ipo_year, sector

Order By ipo_year desc, sector

결과

ipo_year                         sector                             (열 이름 없음)
2021                                                                          882
2021                               Basic Industries                11
2021                               Capital Goods                   35
2021                               Consumer Durables         23

 

COUNT 함수 사용시 주의점: 전체 열이 아닌 특정 열만 지정하면 해당 열의 NULL 값은 제외한다는 것이다. 따라서, 전체 데이터 개수와 COUNT 함수로 얻은 데이터 개수가 다를 수 있다. 

COUNT 함수를 사용할 때 DISTINCT 문을 조합하면 NULL 값이 아닌 고유값의 데이터 개수를 얻을 수 있다. 

SELECT COUNT(*) AS all_row, COUNT(sector) as sector_row, COUNT(DISTINCT sector) as sector_distinctFROM nasdaq_company

결과

all_row     sector_row      sector_distinct
8918       8893                  13

 

데이터 합 구하기: SUM

SUM 함수는 모든 행의 값을 합하지만 DISTINCT 문을 조합해 중복값을 무시하고 고유값에만 SUM함수를 적용할 수 있다.

(열 이름 없음)
SELECT SUM(close_price) FROM nasdaq_company

(열 이름 없음)
586687.653691949

SELECT SUM(DISTINCT close_price) FROM nasdaq_company

(열 이름 없음)
542734.498325871

 

GROUP  BY 문을 조합해 close_price 열의 데이터를 합산하된 sector 별로 그룹을 나눠 합산하는 쿼리이다.

SELECT sector, SUM(close_price) FROM nasdaq_company

GROUP BY sector

결과

sector                                    (열 이름 없음)
Miscellaneous                     10043.4614094049
Public Utilities                      9197.7665861547
Consumer Non-Durables  12882.2909550816
Capital Goods                    54474.5311808456

 

데이터 평균 구하기: AVG 함수

NULL 값은 무시한다. AVG 함수에서도 DISTINCT 문을 조합해 중복값을 무시하고 고유값에만 적용할 수 있다. 

SELECT AVG(close_price) FROM nasdaq_company

(열 이름 없음)
70.2535808516285

SELECT AVG(DISTINCT close_price) FROM nasdaq_company

(열 이름 없음)
109.422277888281

SELECT sector,  AVG(DISTINCT close_price)  FROM nasdaq_company

GROUP BY sector

결과

sector                                     (열 이름 없음)
NULL                                      9250.38984339436
                                                29.7430143411333
Basic Industries                     46.1039010662569
Capital Goods                       112.043390873023
Consumer Durables              32.3150231354164
Consumer Non-Durables      56.8316413977109

평균을 구할 때 자료형에 유의해야 한다. 10/3의 경우 3.3333..  이어야 하나 정수끼리 계산 결과 정수 3으로 취급해 버린다.

이런 상황을 해결하러면 평균을 구하려는 열의 형식을 float이나 decimal과 같은 실수형으로 변환한다.

SELECT 10/3

3

SELECT 10/CONVERT(FLOAT, 3)

3.3333333333

 

최솟값, 최댓값 구하기 : MIN, MAX 함수

SELECT MIN(close_price) ,  MAX(close_price) FROM nasdaq_company 

WHERE close_price > 0 

(열 이름 없음)                    (열 이름 없음)
0.00999999977648258   60775.8359375

 

그룹별로 최댓값, 최솟값을 구할 수 있다.

SELECT sector, MIN(close_price) ,  MAX(close_price) FROM nasdaq_company 

WHERE close_price > 0 

GROUP BY sector

결과

sector                                        (열 이름 없음)                         (열 이름 없음)
Miscellaneous                          0.140400007367134             759.25
Public Utilities                          0.349999994039536             173.199996948242
Consumer Non-Durables       0.0750000029802322            517.969970703125
Capital Goods                         0.0140000004321337           18600
Basic Industries                       0.275400012731552             337.829986572266

 

NULL 값은 무시한다.

 

부분합, 총합 구하기: ROLLUP, CUBE 함수

GROUP BY 문을 ROLLUP 함수와  CUBE 함수에 조합한다. 

GROUP  BY ROLLUP(...)에 입력한 열을 기준으로 오른쪽에서 왼쪽으로 열을 이동하면서 부부합과 총합을 구한다.

SELECT sector, industry, SUM(close_price)

FROM nasdaq_company

GROUP BY ROLLUP(sector, industry)

결과

sector                       industry                                                                                                           (열 이름 없음)
Technology             Internet and Information Services                                                                  6546.67011141777
Technology             Professional Services                                                                                    440.450003147125
Technology             Radio And Television Broadcasting And Communications Equipment    832.435785830021
Technology             Retail: Computer Software & Peripheral Equipment                                  2489.53504157066
Technology             Semiconductors                                                                                              9120.26033765078
Technology             Telecommunications Equipment                                                                   243.75
Technology             NULL                                                                                                                 62410.8200955242

 

233행의 결과는 sector가 Technology이고 industry가   Internet인 close_price의 이다.

오른쪽에서 왼쪽으로 이동하는 것은 industry 가 변하면서 sector가 변하지 않는 것을 보면 알 수 있다. 

239행을 보면 industry가 NULL 인데 바로 여기가 sector 그룹에 대한 부분합이다. 

같은 설명으로 sector, industry가 모두 NULL인 곳이 총합이다. 

 

GROUP BY CUBE(a, b)의 경우 (a,b), (NULL, b), (a, NULL), (NULL, NULL)의 고윳값을 집계하는 그룹을 만든다.

SELECT sector, industry, SUM(close_price)

FROM nasdaq_company

GROUP BY CUBE(sector, industry)

 

모든 값의 표준편차 구하기:STDEV, STDEVP 함수

STDEV:     모든 값의 표준편차

STDEVP:  모집단의 표준편차

SELECT STDEV(close_price), STDEVP(close_price) FROM nasdaq_company

(열 이름 없음)                 (열 이름 없음)
989.751070100126       989.691808891793

SELECT STDEV(distinct close_price), STDEVP(distinct close_price) FROM nasdaq_company

(열 이름 없음)                (열 이름 없음)
1282.7917240247        1282.66240382436

 

퀴즈 3. stock 테이블에서  symbol이 MSFT인 데이터의 2021년1월1일-2021년1월31일까지 주식 종가 중에 최솟값, 최댓값, 평균값을 구하세요.

SELECT 
     MIN([close]) as min_MSFT, 
     MAX([close]) as max_MSFT, 
    AVG([close]) as avg_MSFG 
FROM stock
WHERE symbol = 'MSFT' 
AND date >= '2021-1-1' 
AND date < '2021-2-1'

결과

min_MSFT           max_MSFT                         avg_MSFG
212.25                 238.929992675781           221.975261487459

'IT Story > SQL Story' 카테고리의 다른 글

SQL 함수: 순위 함수  (0) 2022.12.06
SQL 함수: 수학 함수  (0) 2022.12.05
SQL 함수: 날짜 함수  (0) 2022.12.02
SQL 함수: 문자열 함수  (0) 2022.12.02
공통 테이블 식(Common Table Expression, CTE)  (0) 2022.12.01