[ORM]집계함수 사용법(feat. aggregate, annotate)

박민하·2022년 7월 6일
0

DJANGO

목록 보기
17/22
post-thumbnail

  위 데이터베이스 테이블을 바탕으로 annotate와 aggregate를 이해해보자. Avg, Max, Min, Count, Sum 등 다양한 집계 함수를 사용할 수 있지만, 우선 지금은 avg, min 정도만 import 했다.

from django.db.models import Min, Avg

✅ annotate

  annotate는 각각의 컬럼값에 대한 계산을 QuerySet 형태로 반환한다.

✔ 호텔별 최저가 방 가격 구하기

Product.objects.all().annotate(Min('room__price'))
> <QuerySet [<Product: 호텔1 (1)>, <Product: 호텔2 (2)>, <Product: 호텔3 (3)>]>

  min 이라는 가상의 속성을 만들어서 호텔별 최저가 방 가격을 구해보자.

product = Product.objects.all().annotate(min = Min('room__price'))
product[0].min
> Decimal('50000.0000000000')
product[1].min
> Decimal('50000.0000000000')

✔ 호텔별 평균 방 가격 구하기

product = Product.objects.all().annotate(avg = Avg('room__price'))
product[0].avg
> Decimal('70000.00000000000000')
product[1].avg
> Decimal('69333.33333333333333')
product[2].avg
> Decimal('99000.00000000000000')

✅ aggregate

  aggregate는 특정 컬럼 전체에 대한 계산을 QuerySet 형태로 반환한다.

✔ 전체 호텔의 평균 가격 구하기

Room.objects.all().aggregate(avg = Avg('price'))
> Decimal('74500.00000000000000')

  위 값은 아래 코드로도 얻을 수 있다.

product = Product.objects.all().aggregate(avg = Avg('room__price'))
product
> {'avg': Decimal('74500.00000000000000')}
product['avg']
> Decimal('74500.00000000000000')

참고 사이트

엑셀에 대입해서 이해하기

profile
backend developer 🐌

0개의 댓글