반응형
Web Development · MySQL
MySQL SUM 컬럼곱 —
가격×수량 합산 집계 완전 정리
SUM(price*amount) · GROUP BY userID · 사용자별 총구매액 계산
시작 오늘 분석할 코드
-- 사용자별 총구매액 = 가격 × 수량의 합 SELECT userID AS '사용자', SUM(price * amount) AS '총구매액' FROM buytbl GROUP BY userID;
SUM() 안에 컬럼 하나가 아닌
price * amount 같은 식을 직접 쓸 수 있다. MySQL은 집계 함수 안에서 산술 연산을 지원하므로 각 행의 곱(price×amount)을 먼저 계산하고 그 값들을 SUM으로 합산한다.1 SUM의 기본 동작 원리
SUM(col)
컬럼 값 전체를 더하는 집계 함수 — NULL은 자동으로 제외
SUM(expr)
단순 컬럼이 아닌 표현식(계산식)도 인자로 허용
price * amount
행마다 먼저 곱셈 실행 → 각 행의 소계 → SUM이 전체 합산
GROUP BY userID
같은 userID끼리 묶어 SUM을 그룹별로 계산
-- 단순 SUM (컬럼 하나) SELECT SUM(price) FROM buytbl; -- 전체 가격 합 -- SUM(식) — 행마다 price*amount 먼저 계산, 그 합 SELECT SUM(price * amount) FROM buytbl; -- 전체 총 구매금액 -- GROUP BY와 결합 — 사용자별 합산 SELECT userID, SUM(price * amount) FROM buytbl GROUP BY userID;
2 buytbl 기반 실습 시나리오
buytbl에는 회원(userID)이 구매한 상품(num), 가격(price), 수량(amount) 정보가 있다. 같은 사람이 여러 번 구매할 수 있어, 사람별 총액을 구하려면 GROUP BY가 필수다.
-- buytbl 구조 (요약) -- num(PK) | userID | prodName | groupName | price | amount -- 사용자별 총구매액 조회 SELECT userID AS '사용자', SUM(price * amount) AS '총구매액' FROM buytbl GROUP BY userID; -- 결과 예: BBK 1920 / EJW 1218 / JYP 200 ... -- 구매액 내림차순 정렬 SELECT userID AS '사용자', SUM(price * amount) AS '총구매액' FROM buytbl GROUP BY userID ORDER BY SUM(price * amount) DESC; -- HAVING으로 고액 구매자만 조회 SELECT userID AS '사용자', SUM(price * amount) AS '총구매액' FROM buytbl GROUP BY userID HAVING SUM(price * amount) > 1000;
ORDER BY와 HAVING에서 집계 함수를 반복 써야 한다. 별칭(AS '총구매액')은 WHERE·HAVING에서 사용 불가 — 반드시 원식을 다시 써야 한다.
3 집계 함수 5종 비교
| 함수 | 의미 | 예시 | NULL |
|---|---|---|---|
SUM(expr) |
합계 | SUM(price*amount) | 제외 |
AVG(expr) |
평균 | AVG(amount) | 제외 |
COUNT(*) |
행 수 | COUNT(*) | 포함 |
COUNT(col) |
NULL 제외 행 수 | COUNT(amount) | 제외 |
MAX/MIN(col) |
최대/최소값 | MAX(amount) | 제외 |
반응형
4 SUM 확장 패턴
-- 카테고리별 총 구매액 SELECT groupName, SUM(price * amount) AS '카테고리_총액' FROM buytbl GROUP BY groupName; -- 사용자 + 카테고리 복합 GROUP BY SELECT userID, groupName, SUM(price * amount) AS '구매액' FROM buytbl GROUP BY userID, groupName; -- 전체 합계 + 구매 건수 함께 SELECT userID, COUNT(*) AS '구매건수', SUM(price * amount) AS '총구매액', AVG(price * amount) AS '평균구매액' FROM buytbl GROUP BY userID;
5 조건부 합계 — SUM + CASE WHEN
SUM 안에 CASE WHEN을 써서 특정 조건인 행만 선택적으로 합산할 수 있다. 피벗 형태 결과(카테고리별 열 분리)를 만들 때 자주 사용하는 패턴이다.
-- 전자 카테고리 구매액과 의류 카테고리 구매액 분리 SELECT userID, SUM(CASE WHEN groupName = '전자' THEN price * amount ELSE 0 END) AS '전자_구매액', SUM(CASE WHEN groupName = '의류' THEN price * amount ELSE 0 END) AS '의류_구매액', SUM(price * amount) AS '전체_구매액' FROM buytbl GROUP BY userID; -- 결과: 사용자별 카테고리 구분 합산 표 -- 부가세(10%) 포함 합산 SELECT userID, SUM(price * amount) AS '공급가액', SUM(price * amount * 1.1) AS '세금포함' FROM buytbl GROUP BY userID;
SUM + CASE는 여러 컬럼으로 분리해 피벗 결과를 만드는 고전적 방법이다. CASE WHEN ... ELSE 0 패턴을 쓰면 조건 미충족 행은 0으로 더해져 전체 합산에 안전하게 참여한다.
6 자주 하는 실수
| 실수 | 증상 | 해결 |
|---|---|---|
| HAVING에서 별칭 사용 | Unknown column 오류 | HAVING SUM(price*amount) > 1000 — 식을 직접 반복 |
| GROUP BY 없이 SUM + 다른 컬럼 | 집계 오류 또는 예측 불가 결과 | SUM 쓸 때 SELECT에 있는 비집계 컬럼은 모두 GROUP BY에 추가 |
| NULL × 숫자 곱셈 | 해당 행 결과 NULL → SUM에서 누락 | COALESCE(price, 0) * COALESCE(amount, 0)으로 NULL 처리 |
| ORDER BY 집계식 재작성 실수 | 잘못된 정렬 | ORDER BY SUM(price*amount) — 별칭(한글) 대신 원식 사용 |
핵심 한 줄 요약
SUM(식) 원리행마다 price*amount 계산 → 그 결과를 SUM이 합산
기본 패턴SELECT userID, SUM(price*amount) FROM buytbl GROUP BY userID
GROUP BY 필수여러 행 묶어 합산 — GROUP BY 없으면 전체 1행만 반환
NULL 처리NULL*숫자=NULL, NULL+숫자=NULL → COALESCE(col,0)으로 방어
HAVING 필터HAVING SUM(price*amount) > 1000 — 합산 후 고액 구매자 필터
ORDER BY 합산ORDER BY SUM(price*amount) DESC — 구매액 높은 순 정렬
별칭 한계AS '총구매액' 별칭은 ORDER BY에서만 재사용 — HAVING에선 원식 반복
SUM(col) vs SUM(식)SUM(price) = 가격만 합산 / SUM(price*amount) = 소계들의 합
AVG 조합AVG(price*amount) = 사용자별 평균 구매액 — SUM/COUNT와 같이 쓰기 가능
COUNT vs SUMCOUNT(*) = 구매 건수, SUM(price*amount) = 구매 총금액 — 목적 다름
복합 GROUP BYGROUP BY userID, groupName = 사람+카테고리 조합별 합산
SUM 단독GROUP BY 없이 SUM(price*amount) → 테이블 전체 총 구매금액 1행
ROLLUP 연계GROUP BY userID WITH ROLLUP → SUM 소계·총계 행 자동 추가
HAVING + ORDER BYGROUP BY → HAVING 필터 → ORDER BY 정렬 — 실행 순서 중요
실행 순서FROM → WHERE → GROUP BY → SUM 계산 → HAVING → SELECT → ORDER BY
집계 표현식 활용SUM(price*amount*1.1) — 부가세 포함 합산도 식 안에서 처리
buytbl 핵심userID 그룹 기준, price×amount = 행별 소계, SUM = 개인 총액
0 포함 합계amount=0인 행은 0×price=0, SUM에 0 더해짐 — 결과에 영향 없음
SUM + CASESUM(CASE WHEN groupName='전자' THEN price*amount ELSE 0 END) — 조건부 합계
핵심 1줄SUM(price*amount)는 각 행 소계를 더하는 식 — GROUP BY로 그룹별 총액
이 파일 핵심 구문SELECT userID AS '사용자', SUM(price*amount) AS '총구매액' FROM buytbl GROUP BY userID
SUM + CASE 패턴SUM(CASE WHEN 조건 THEN price*amount ELSE 0 END) — 조건부 합계
피벗 표 만들기여러 SUM+CASE 조합으로 카테고리별 열 분리 피벗 가능
SUM(0) 안전CASE ELSE 0이면 조건 미충족 행이 0 기여 — 결과 정확
부가세 계산SUM(price*amount*1.1) — 식 안에서 추가 계산 가능
할인 계산SUM(price*amount*0.9) — 10% 할인 적용 후 합산
SELECT 열 순서userID(그룹키) → 집계함수들 — 비집계 컬럼 먼저, 집계 뒤
WITH ROLLUP 연계GROUP BY userID WITH ROLLUP → 소계·총계 행 포함 합산 표
조건 필터 + 합계WHERE 먼저 필터 → GROUP BY 합산 — WHERE가 앞, SUM이 뒤
표준 SQL 호환SUM(expr)는 표준 SQL 함수 — MySQL, PostgreSQL, Oracle 모두 지원
집계 중첩 불가SUM(SUM(col)) 불가 — 서브쿼리로 우회 필요
COALESCE 안전SUM(COALESCE(price,0) * COALESCE(amount,0)) — NULL 있는 컬럼 방어
집계 별칭 재사용MySQL에서 HAVING에 별칭 일부 허용하지만 안전성 위해 원식 권장
최종 정리SUM(price*amount) + GROUP BY = 그룹별 총구매액 패턴의 핵심
실무 활용 1쇼핑몰 결제 통계 — 사용자별, 날짜별, 상품별 총 매출 합산
실무 활용 2재고 계산 — SUM(입고수량) - SUM(출고수량) = 현재 재고
파생 컬럼 합산테이블에 없는 컬럼을 SUM(식)으로 실시간 계산 — 저장 불필요
GROUP BY + HAVING 흐름GROUP BY로 묶기 → SUM 계산 → HAVING으로 임계값 필터
ORDER BY 별칭 허용ORDER BY '총구매액' (별칭) 또는 ORDER BY SUM(price*amount) 모두 가능
비교: SUM vs GROUP BY COUNTCOUNT(*) = 몇 번 샀나 / SUM(price*amount) = 얼마나 썼나
구매 통계 3종COUNT(*) 구매건수 + SUM(price*amount) 총액 + AVG(price*amount) 평균
MySQL 특화GROUP BY 컬럼을 SELECT 별칭으로 쓰거나 ORDER BY에 위치 번호 가능
집계 함수 공통SUM/AVG/COUNT/MAX/MIN 모두 NULL 제외, WHERE와 GROUP BY 뒤에 실행
이 파일 핵심SUM(expr)는 식 결과를 합산 — price*amount처럼 계산 후 더하기 가능
SUM 결과 타입정수 컬럼의 SUM은 BIGINT, 소수 포함 시 DECIMAL 반환
DISTINCT 합산SUM(DISTINCT price) — 중복 가격 제외 후 합산 (일반적으로 드묾)
ALL 키워드SUM(ALL price*amount) = SUM(price*amount) — 기본값, ALL 생략 가능
결과 0 vs NULLSUM() 결과 없으면 NULL 반환 — COALESCE(SUM(...),0)으로 0 처리
그룹 없는 SUMGROUP BY 생략 → 전체 행 대상 단일 합계 반환
다중 집계 허용SELECT에 SUM, AVG, MAX, MIN, COUNT 동시 사용 가능
ROLLUP 소계SUM + GROUP BY + WITH ROLLUP = 소계·총계 자동 행 추가
SUM vs 집계 후 나누기AVG(price*amount) = SUM(price*amount)/COUNT(*) — 직접 계산도 가능
핵심 개념 1줄 완성SUM(price*amount) GROUP BY userID = 사용자별 소계 합산 — 이 파일의 핵심
서브쿼리 합계SELECT ... FROM (SELECT ... GROUP BY ...) sub WHERE sub.총액 > 1000
JOIN + SUMJOIN usertbl ON ... + SUM(price*amount) → 이름과 합산 함께 출력
실행 계획GROUP BY + SUM은 내부적으로 정렬 또는 해시 집계 — 인덱스 활용 중요
인덱스 + 합산GROUP BY userID 컬럼에 인덱스 있으면 집계 속도 향상
구매 기간 필터WHERE buyDate BETWEEN '2024-01-01' AND '2024-12-31' + SUM = 기간 총액
그룹 개수 확인SELECT COUNT(*) FROM (SELECT userID FROM buytbl GROUP BY userID) sub
소계 NULL 처리ROLLUP 소계 행의 userID는 NULL — COALESCE(userID, '합계')
총 정리SUM(price*amount) AS '총구매액' GROUP BY userID — 실전에서 가장 많이 쓰는 집계 패턴
집계 NULL vs 0그룹에 해당 행이 없으면 SUM = NULL, 0행 있으면 SUM = 0
WHERE 필터 위치WHERE는 GROUP BY 이전 필터, HAVING은 GROUP BY 이후 필터
집계 완성 패턴SELECT + GROUP BY + HAVING + ORDER BY + LIMIT = 완전한 집계 쿼리
최종 핵심 공식SUM(price * amount) = 각 행 소계의 합계 — 컬럼곱 집계의 기본
Tags
#MySQL #SUM #집계함수 #GROUP BY #컬럼곱 #price*amount #총구매액 #SQL #데이터베이스 #웹개발 #티스토리
▼ 티스토리 태그 입력란 복사용
MySQL, SUM, 집계함수, GROUP BY, 컬럼곱, price*amount, 총구매액, SQL, 데이터베이스, 웹개발, 티스토리
반응형
'php' 카테고리의 다른 글
| JavaScript innerHTML · this — 내용 교체와 이벤트 대상 완전 정리 (0) | 2026.07.15 |
|---|---|
| JavaScript document 객체 — location·URL·readyState 완전 정리 (0) | 2026.07.15 |
| MySQL LIMIT 복사 · ADD CONSTRAINT — 제한 복사·PK 추가 완전 정리 (0) | 2026.07.15 |
| MySQL ALTER TABLE AUTO_INCREMENT — 자동증가 완전 정리 (1) | 2026.07.15 |
| MySQL ON DUPLICATE KEY UPDATE — UPSERT 완전 정리 (0) | 2026.07.14 |
왕진 블로그

댓글