
묶은 데이터를 처리하려면 반드시 SUM, COUNT 같은 집계 방식으로 계산해야 한다.
GROUP BY를 사용하면 묶은 데이터(그룹화한 데이터)만 결과로 보여줄 수 있다.
SELECT 컬럼A,
SUM(AMOUNTSUM)
FROM DATA
WHERE date >= '2021-12-01'
AND date < '2022-02-01'
GROUP BY 컬럼A;

SELECT DATE,
COUNT(URL) AS "PAGE VIEW",
COUNT(DISTINCT(DEVICEID)) AS "방문 디바이스 수"
FROM DATA
WHERE DATE >= '2021-05-01'
AND DATE < '2021-06-01'
AND URL = '/web/main'
GROUP BY DATE
ORDER BY DATE;

SELECT SUM(컬럼A),
SUM(AMOUNTSUM)
FROM DATA
WHERE date >= '2021-12-01'
AND date < '2022-02-01';

예를 들어 보자,
할머니, 마트에서 과일을 산다고 생각해보세요. 지금 손에 이렇게 적혀 있어요:
사과는 몇 개인지?
사과 값은 얼마인지?
근데 마트에는 사과가 여기저기 흩어져 있어요. 한 바구니에 3개, 저쪽 바구니엔 5개, 또 다른 바구니엔 2개가 있어요.
이제 이렇게 질문하는 거예요:
"사과를 전부 합쳐서 몇 개인지 알고 싶어요. 그리고 가격도 다 합쳐주세요."
그럼 마트 직원이 사과를 전부 모아야겠죠? 이게 'GROUP BY'! 비슷한 것끼리 모으는 거죠.
=> GROUP BY = 사과를 전부 모으는 행위
그런데, 만약 할머니가 갑자기 이렇게 물어보시면 직원이 혼란스러울 거예요:
"사과는 몇 개인지 알려주세요. 하지만 다 합치지 말고, 그냥 보여주세요!"
=>사과의 SUM만 해주세요. GROUP BY하지는 말고
직원은 이렇게 대답할 겁니다:
"할머니, 다 합쳐달라고 하셨으면 (SUM처럼) 전부 계산해서 보여드릴게요!
아니면, 어느 바구니에 몇 개인지 따로 보여드리려면 모으는 기준을 정해주세요."
GROUP BY 하지 말고, SUM만 하던가
GROUP BY 했으면, 모으는 기준을 정해달라.
=> 데이터를 모아놓고 나면 그다음에 "무엇을 보여줄지"를 명확히 정해야 하기 때문
예를 들어, 바구니별로 과일을 모아놨는데, 그냥 보여달라고만 하면 직원은 "바구니마다 뭐를 보여줘야 하지?" 하고 헷갈릴 수 있어.
그래서 "바구니별로 과일 개수를 세어줘(SUM)" 또는 "바구니마다 몇 번 팔렸는지 알려줘(COUNT)" 같은 명확한 지시가 필요하다는 거야.
즉, 모은 후에 "뭘 할지"를 꼭 정해줘야만 결과를 제대로 보여줄 수 있어!
A. GROUP BY는 묶은 상태를 보여주는 것 자체가 목적이 아니야. 묶어놓고 "그 다음에 뭘 보여줄지"를 명확히 지정해야만 데이터를 반환할 수 있어.
그 이유는 SQL의 기본 작동 방식때문.
GROUP BY를 하면 데이터가 묶여서 그룹화되지만, 그룹화된 데이터를 보여줄 때는 반드시 "어떤 데이터를 집계하거나 계산할지"를 명확히 정해야 해.
묶은 상태 그대로 보여달라고 하면, 그룹화된 데이터에서 어떤 값(예: 합계, 평균, 최대값)을 보여줘야 할지 모르기 때문에 SQL이 혼란스러워.

SELECT 바구니ID, 과일
FROM 테이블
GROUP BY 바구니ID;
"바구니 1에는 사과랑 배가 있는데, '과일' 컬럼에서 뭘 보여줘야 하지?"
묶인 데이터에서 하나를 골라야 하는데, 골라줄 기준이 없으니까 오류발생
"바구니별로 사과 개수를 알려줘. 그런데 첫 번째 바구니 사과의 색깔도 같이 보여줘!"
문제가 뭐냐면, GROUP BY는 바구니별로 묶어서 정리했기 때문에,
첫 번째 바구니의 '사과 색깔'을 보여줄 방법이 없어요!
왜냐하면, 이미 바구니별로 데이터를 다 합쳤기 때문에 "사과 색깔"이 무슨 기준으로 나와야 할지 몰라요.
사과 색깔이 하나일 수도 있고, 여러 개일 수도 있잖아요!
그래서 GROUP BY를 쓰면 묶인 데이터 외에는 SELECT에서 쓸 수 없어요.
묶이지 않은 데이터를 보여주려고 하면, SQL 엔진이 헷갈려서 오류가 나는 거예요.
SELECT 바구니ID
FROM 테이블
GROUP BY 바구니ID;
(근데 의미가..)
SELECT 바구니ID, 과일, COUNT(*)
FROM 테이블
GROUP BY 바구니ID, 과일 WITH ROLLUP;
여기선 묶인 결과를 집계하면서 부분합처럼 중간 상태를 볼 수 있음
SELECT *
FROM 테이블;
GROUP BY 없이 데이터를 필터링해서 보여주면, 묶지 않은 상태 그대로 볼 수 있음 (근데 의미가..)