Django에서 GROUP BY로 쿼리

Shubham Vora 2024년2월15일
  1. Django에서 GROUP BY 쿼리 생성
  2. GROUP BY 쿼리와 함께 다중 집계 사용
  3. 여러 열이 있는 GROUP BY 레코드
  4. 모든 그룹의 레코드 필터링
Django에서 GROUP BY로 쿼리

대부분의 사용자는 SQL에 익숙하며 GROUP BY 절을 사용하여 SQL 쿼리를 작성하여 그룹으로 데이터를 가져오는 방법을 알고 있습니다. GROUP BY 절을 사용하여 단일 열 또는 다중 열 값을 기반으로 레코드 그룹을 만들고 집계 기능을 수행할 수 있습니다.

이 기사에서는 Bike_id, Bike_name, Bike_brand, Bike_color, Bike_bought_date, Is_bike_premium, Bike_price 등을 포함하는 Bike 데이터베이스에서 작업하고 있다고 가정합니다. .

위의 Bike 데이터베이스에서 GROUP BY 절을 사용하여 다른 작업을 수행하는 방법을 배웁니다. 또한 GROUP BY 절을 사용하여 SQL 쿼리를 먼저 작성하고 Python으로 변환하여 독자가 Django에서 쿼리 작성을 쉽게 이해하고 빠르게 배울 수 있도록 합니다.

Django에서 GROUP BY 쿼리 생성

색상에 따라 자전거의 수를 세고 싶다고 가정합니다. 간단히 말해서 색상에 따라 자전거 그룹을 만들고 싶고 이를 위해 아래에 SQL 쿼리를 작성했습니다.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
GROUP BY
    Bike_color

위 SQL 쿼리의 출력으로 2개의 열을 얻습니다. 하나는 Bike_color이고 다른 하나는 특정 색상의 자전거 수를 나타내는 Total_Bikes입니다.

이제 위의 SQL 쿼리를 Python 코드로 변환하여 동일한 결과를 얻습니다.

from django.db.models import Count

Bike.objects.values("Bike_color").annotate(Total_bikes=Count("Bike_id"))

출력:

django groupby 생성

  1. values() - SQL 쿼리의 GROUP BY 절을 대체합니다. values() 메서드의 인수로 사용해야 하는 SQL 쿼리에서 GROUP BY 절과 함께 사용하는 모든 열.
  2. annotate() - annotate() 메서드는 집계 함수를 인수로 사용하여 모든 그룹에 적용합니다.

이렇게 하면 색상에 따라 자전거 그룹을 만들고 Python 쿼리를 사용하여 같은 색상의 자전거 수를 셀 수 있습니다.

사용자가 values() 이전에 annotate() 함수를 호출하면 그룹의 행에 집계 함수가 적용되지 않고 전체 레코드에 적용됩니다. 따라서 쿼리를 작성하는 동안 사용하는 메서드의 순서를 확인하십시오.

GROUP BY 쿼리와 함께 다중 집계 사용

여기에서는 색상에 따라 자전거 그룹을 만듭니다. 그런 다음 Count() 집계 기능을 사용하여 모든 색상의 자전거를 세고 Min() 집계 기능을 사용하여 모든 그룹에서 최소 비용으로 자전거를 가져옵니다.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes,
    MIN(Bike_price) As cheap_bike
FROM
    Bike
GROUP BY
    Bike_color

아래에서는 위의 SQL 쿼리를 Python 코드로 변환했습니다.

from django.db.models import Count
from django.db.models import Min

Bike.objects.values("Bike_color").annotate(
    Total_bikes=Count("Bike_id"), cheap_bike=Min("Bike_price")
)

출력:

django groupby multiple

이런 식으로 Python에서 group by 쿼리와 함께 Count()Min() 다중 집계 함수를 사용했습니다.

여러 열이 있는 GROUP BY 레코드

아래 SQL 쿼리에서 Bike_colorIs_bike_premium 필드를 GROUP BY 절과 함께 사용했습니다. 쿼리는 색상 및 프리미엄 범주에 있는지 여부에 따라 레코드를 그룹화합니다.

SELECT
    Bike_color,
    Is_bike_premium,
    COUNT(Bike_id) AS Total_bikes,
FROM
    Bike
GROUP BY
    Bike_color,
    Is_bike_premium

위의 SQL 쿼리를 Python 코드로 변환하려면 values() 메서드 내에 여러 필드를 추가해야 합니다.

from django.db.models import Count

Bike.objects.values("Bike_color", "Is_bike_premium").annotate(
    Total_bikes=Count("Bike_id")
)

출력:

django groupby multiple columns

모든 그룹의 레코드 필터링

이 섹션에서는 색상에 따라 Bike 테이블의 모든 레코드 그룹을 만들고 모든 그룹에서 모든 비프리미엄 자전거를 필터링합니다. 간단히 말해서 색상에 따라 비프리미엄 자전거 그룹을 만들 것입니다.

아래 SQL 쿼리에서 WHERE 절을 사용하여 자전거를 필터링했습니다.

SELECT
    Bike_color,
    COUNT(Bike_id) AS Total_bikes
FROM
    Bike
WHERE
    Is_bike_premium = False
GROUP BY
    Bike_color

위의 SQL 쿼리를 Python 코드로 변환하기 위해 Python의 filter() 메서드를 사용하고 필터링 조건을 인수로 전달했습니다.

from django.db.models import Count

Bike.objects.values("Bike_color").filter(Is_bike_premium=False).annotate(
    Total_bikes=Count("Bike_id")
)

출력:

django groupby 필터

이 기사에서 Django에서 GROUP BY 쿼리를 생성하는 방법을 배웠습니다. 또한 group by 쿼리의 다양한 사용 사례를 보았습니다.

또한 사용자는 orderBy() 메서드와 함께 group by 쿼리를 사용하여 모든 그룹의 레코드를 정렬할 수 있습니다.

작가: Shubham Vora
Shubham Vora avatar Shubham Vora avatar

Shubham is a software developer interested in learning and writing about various technologies. He loves to help people by sharing vast knowledge about modern technologies via different platforms such as the DelftStack.com website.

LinkedIn GitHub

관련 문장 - Django SQL