[PostgreSQL]column must appear in the GROUP BY clause or be used in an aggregate function

error ์Љ.์Šˆ์Љ.๋‚ด.๋‚ดํ•œํ…Œ.์™œ.์ด๋Ÿฌ๋Š”.๋ฐ.


์Œ~^^ ๊ทธ๋Ÿด ์ค„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค~^^ ๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์„ ์ •๋„๋กœ ์ •๋ง ์ •๋ง ๋งŽ์ด ๋ณด๋Š” ์—๋Ÿฌ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด ์—๋Ÿฌ ๋„๋Œ€์ฒด ์™œ ๋ฐœ์ƒํ•˜๋Š”๊ฑธ๊นŒ?!

GROUP BY

GROUP BY๋Š” ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง„ ํ–‰๋ผ๋ฆฌ ํ•˜๋‚˜์˜ ๊ทธ๋ฃน์œผ๋กœ ๋ญ‰์ถฐ์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. ์•„๋ž˜์˜ ์˜ˆ์‹œ๋ฅผ ๋ณด๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ์ดํ•ด๊ฐ€ ๊ฐˆ ๊ฒƒ์ด๋‹ค.

group by

์ด๋Š” Employee๋ผ๋Š” ํ…Œ์ด๋ธ”์—์„œ DeptID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ทธ๋ฃนํ•‘ํ•ด์„œ Salary์˜ ํ‰๊ท ์„ ๊ตฌํ•œ๊ฑธ ๋ณด์—ฌ์ฃผ๊ณ  ์žˆ๋‹ค.

์œ„์ฒ˜๋Ÿผ ๋ณดํ†ต GROUP BY์ ˆ์€ ์ง‘๊ณ„ ํ•จ์ˆ˜์™€ ๊ฐ™์ด ์‚ฌ์šฉ๋˜๊ณ ๋Š” ํ•˜๋Š”๋ฐ, ์ง‘๊ณ„ ํ•จ์ˆ˜๋Š” ์—ฌ๋Ÿฌ ํ–‰์˜ ๊ฐ’์„ ๋”ํ•˜๊ฑฐ๋‚˜, ํ‰๊ท  ๊ฐ’์„ ๋‚ด๊ฑฐ๋‚˜, ๊ฐœ์ˆ˜๋ฅผ ์„ธ๋Š” ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ์— ๊ด€ํ•œ ๊ณ„์‚ฐ์„ ํ•œ๋‹ค.

์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ง‘๊ณ„ ํ•จ์ˆ˜์—๋Š” COUNT(), AVG(), MIN(), MAX(), SUM() ๋“ฑ์ด ์žˆ๋‹ค.

Coulum must apper in the GROUP BY clause โ€ฆ

์•„๋ž˜์™€ ๊ฐ™์€ ํ…Œ์ด๋ธ”์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

id name location cvs purchases
1 KIM SEOUL GS25 20000
2 LEE SEOUL Emart24 300
3 PARK BUSAN GS25 4500
4 CHOI DAEGU CU 90000
5 KANG BUSAN Emart24 34000
6 YOON DAEGU CU 2400

์šฐ๋ฆฌ๋Š” ํŠน์ • ํŽธ์˜์ ์—์„œ ๋ฐœ์ƒํ•œ ๊ตฌ๋งค์•ก์˜ ์ด์•ก์„ ์•Œ๊ณ ์‹ถ์„ ๋•Œ, ์ด๋Ÿฐ์‹์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์“ธ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

SELECT location, cvs, SUM(purchases) AS sum
FROM table
GROUP BY cvs;

๊ทธ๋Ÿฐ๋ฐ ์ด๋Ÿฐ ์ฟผ๋ฆฌ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚ ๊ฒƒ์ด๋‹ค.

ERROR: column 'table.location' must appear in the
GROUP BY clause or be used in an aggregate function

์ด๊ฒŒ ๋จธ..๋จธ์„  ์†Œ๋ฆฌ๊ณ ..

๊ทธ๋ž˜์„œ ๋ญ˜ ์ž˜๋ชปํ–ˆ์„๊นŒ?

์œ„์˜ ์ฟผ๋ฆฌ๋ฅผ ์ž˜ ๋ณด์ž. Select๋ฅผ ํ•ด์˜ค๋Š” ์ปฌ๋Ÿผ์€ ์ด ์„ธ ๊ฐ€์ง€์ด๋‹ค. location, cvs, average. ๊ทธ๋Ÿฐ๋ฐ group by ์ ˆ์—์„œ๋Š” cvs๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ฌถ๋Š”๋‹ค๊ณ  ์ ํ˜€์žˆ๊ณ , ๊ฐ’์€ ์ง‘๊ณ„ํ•จ์ˆ˜์ธ SUM()ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌถ์–ด์ฃผ๊ณ  ์žˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ location์€? ์•„๋ฌด๊ฒƒ๋„ ์—†๋‹ค! ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋Š” ํ˜ผ๋ž€์ด ์˜จ ๊ฒƒ์ด๋‹ค. ์•„๋‹ˆโ€ฆ๋ญ˜๋กœโ€ฆ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•ด์•ผํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์šฉโ€ฆํ•˜๋ฉด์„œ ๋ฐ˜ํ™˜ํ•œ ๊ฒƒ์ด ์œ„์˜ ์—๋Ÿฌ์ด๋‹ค.

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•

1. GROUP BY ์ ˆ์— ์ถ”๊ฐ€

SELECT location, cvs, SUM(purchases) AS sum
FROM table
GROUP BY cvs, location

์ด๋Ÿฐ์‹์œผ๋กœ location๊นŒ์ง€ ์ถ”๊ฐ€๋ฅผ ํ•˜๊ฒŒ ๋˜๋ฉด, ํŽธ์˜์  ๋ณ„๋กœ, ๋˜ ์œ„์น˜๋ณ„๋กœ ๊ทธ๋ฃนํ•‘์ด ๋  ๊ฒƒ์ด๋‹ค.

location cvs sum
SEOUL GS25 20000
SEOUL Emart24 300
BUSAN GS25 4500
BUSAN Emart24 34000
DAEGU CU 92400

2. SELECT๋ฌธ์—์„œ ์ง€์šฐ๊ธฐ

๋งŒ์•ฝ์— location์ด ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด ์—†์• ๋Š”๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋œ๋‹ค. ๊ทธ๋ƒฅ ํŽธ์˜์ ๋ณ„๋กœ ์ด ์•ก์„ ๊ตฌํ•˜๊ณ ์‹ถ๋‹ค๋ฉด, location์€ ์žˆ์–ด๋ดค์ž ํ•„์š”์—†๋Š” ์ •๋ณด๊ฐ€ ๋  ๋ฟ์ด๋‹ค.

SELECT cvs, SUM(purchases) AS sum
FROM table
GROUP BY cvs
cvs sum
GS25 24500
Emart24 34300
CU 92400

3. ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉ

์—๋Ÿฌ์—์„œ๋„ ๋‚˜์˜ค๋“ฏ์ด ์ง‘๊ณ„ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. COUNT, SUM, AVG ๋“ฑ๋“ฑ..๋‚ด๊ฐ€ ํ•„์š”ํ•œ ํ•จ์ˆ˜๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์„œ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด GROUP BY์—์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค.

์•„๋‹ˆ๋ฉด GROUP BY์ ˆ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , window function์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ํ•˜๋‚˜์˜ ๋ฐฉ๋ฒ•์ด ๋œ๋‹ค.


Written by@UndefinedP
๊ธฐ๋ก์„ ์ž˜ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์–ด์š”

GitHub