Group by
# Grouping by a single column
data를 group으로 나눈 다음에 group별로 aggregate 할 수 있도록 해준다.
'Apple Stock prices dataset'에서 년도 별로 data(row)가 몇 개(행)씩 있는지 세기?
sum, avg, min, max와 같은 aggregate 함수는 어떤 column의 value들을 계산할 것인지 지정이 필요하기 때문에
sum( ), avg( ), min( ), max( ) 등 ( ) 안에 계산하려는 column명을 명시해야 하지만
count( ) 함수의 경우 어떤 열을 선택하던, 그 결과값은 동일하기 때문에
보통 count(1) 또는 count(*)로 입력한다.
# 열 간 연산 후, grouping by a column
( )안에 하나의 column말고 column들끼리의 simple arithmetic을 넣어도 상관없다.
예를 들어, 아래의 "market_sale" table에서
"판매품목" 별 , 매출 (가격 * 수량의 합)을 구하고 싶다고 하자.
판매품목 | 가격 | 수량 |
A | 1,000 | 3 |
C | 3,000 | 2 |
B | 2,000 | 1 |
B | 2,000 | 4 |
A | 1,000 | 2 |
위의 쿼리에 대한 결과물은 아래와 같을 것이다.
판매품목 | 판매액 |
A | 5,000 |
C | 6,000 |
B | 10,000 |
+ 여기서 추가로 판매액이 높은 순서대로 (판매액 내림차순) 정렬하고 싶다면 group by 뒤에 order by ~절을 추가해주면 된다
select 판매품목,
sum (가격 * 수량) as 판매액
from market_sale
group by 판매품목
order by 판매액 desc (sql 별로 '판매액'이라고 적으면 정렬이 안되는 경우가 있으므로, 이 때는 '가격 * 수량'이라고 적으면 됨)
# Grouping by multiple columns
같은 dataset에서 두 개의 열( 'year' & 'month' )에 대하여 grouping하고 싶다고 하자.
위의 쿼리에 대한 결과는 아래와 같은 형식일 것이다.
year | month | count |
... | ... | ... |
+ 추가로 grouping 하는데 기준이 되는 열이 너무 많거나, group by 절 뒤에 오는 text가 너무 길다면 편의상 숫자를 이용하여도 쿼리는 같은 결과를 도출한다. 위의 예시에서
group by year, month 부분을
group by 1 , 2 로 바꿔주어도 결과는 동일하다.
+ 조건을 추가하고 싶을 때 : where 절 활용
from 절 뒤, group by 절 앞에 삽입되어야 한다.
select ~~~, sum ( )
from ~~~
where ~~~~
group by ~~
order by ~~
+ 참고자료
https://mode.com/sql-tutorial/sql-group-by/
'Study > SQL' 카테고리의 다른 글
SQL : Having (0) | 2023.07.14 |
---|---|
SQL : Distinct (0) | 2023.07.10 |
SQL : Aggregate functions : Count, Sum, Min/Max, Avg (0) | 2023.07.06 |
SQL : not, order by (0) | 2023.07.01 |
SQL : is null, and, or (0) | 2023.07.01 |