데이터를 특징별로 분류하여, 이를 기준으로 분석하는 기법이다. 단 몇 줄의 쿼리로, 수 많은 데이터를 분류 및 집계할 수 있다.
다만 GROUP BY에 명시된 컬럼만을 가지고 조회할 수 있다.
(그룹 화 이후에 일반 컬럼을 SELECT 할 수 없다.)
GROUP화 된 컬럼을 필터링 하는 것
ORDER BY를 통해 record를 정렬하는 것
조회 개수를 지정하는 것

SELECT
ptype AS "결제 방법",
COUNT(ptype) AS "결제 횟수"
FROM
payments
GROUP BY
ptype

SELECT
ptype AS "상품보관 타입",
COUNT(ptype) AS "상품 개수",
AVG(price) AS "평균 가격"
FROM
products
GROUP BY
ptype

SELECT
users.nickname AS "사용자 닉네임",
COUNT(*) AS "배송주문 완료 횟수"
FROM
users
JOIN orders ON
orders.user_id = users.id
AND
orders.status = 'DELIVERED'
GROUP BY
users.nickname

SELECT
ptype AS "결제 방식",
ROUND(AVG(amount),2) AS "평균 결제 금액"
FROM
payments
GROUP BY
ptype
HAVING
AVG(amount) >= 36000
;

-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
;
-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 35000
;

-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) >= 20000
AND
SUM(order_details.count) >= 10
;

-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) IS NULL
ORDER BY
products.price
;

-- 상품 이름과 가격을 기준으로, 누적 판매정보(판매량, 매출)를 조회
SELECT -- 4
products.name AS "상품명",
products.price AS "가격",
SUM(order_details.count) AS "누적 판매량",
SUM(products.price * order_details.count) AS "누적 매출"
FROM -- 1
products
LEFT JOIN order_details ON -- 2
order_details.product_id = products.id
GROUP BY -- 3
products.name,
products.price
HAVING
SUM(products.price * order_details.count) IS NOT NULL
ORDER BY
"누적 매출" DESC
LIMIT
5
;
