2026_최신기출유형_08회
-2. 제품별구매조회 쿼리 0/7
-쿼리 비교 X [제품별구매조회] 쿼리 (SELECT 제품.제품명, Count(구매.구매일자) AS 구매건수, Round(Avg([구매수량]),1) AS 평균구매, Max(구매.[구매금액]) AS 최대금액 INTO 제품별구매내역 FROM 제품 INNER JOIN 구매 ON 제품.제품번호 = 구매.제품번호 GROUP BY 제품.제품명, Right([제조회사],2) HAVING (((Count(구매.구매일자))>=3) AND ((Right([제조회사],2)) In ("전자","통신"))) ORDER BY Max(구매.[구매금액]) DESC; )이 정답(SELECT 제품.제품명, Count(구매.구매일자) AS 구매건수, Round(Avg([구매수량]),1) AS 평균구매, Max(구매.구매금액) AS 최대금액 INTO 제품별구매내역 FROM 제품 INNER JOIN 구매 ON 제품.제품번호 = 구매.제품번호 WHERE (((Right([제조회사],2)) In ("전자","통신"))) GROUP BY 제품.제품명 HAVING (((Count(구매.구매일자))>=3)) ORDER BY Max(구매.구매금액) DESC; )과 다릅니다.
어느 부분이 오답인지 잘 모르겠습니다.
안녕하세요.
오답의 핵심은 Right([제조회사],2) 조건을 WHERE가 아니라 GROUP BY + HAVING으로 처리한 것입니다.
작성자 쿼리는 다음 구조입니다.
GROUP BY 제품.제품명, Right([제조회사],2)
HAVING Count(구매.구매일자)>=3
AND Right([제조회사],2) In ("전자","통신")정답은 다음 구조입니다.
WHERE Right([제조회사],2) In ("전자","통신")
GROUP BY 제품.제품명
HAVING Count(구매.구매일자)>=3여기서 두 조건의 성격이 다릅니다.
Right([제조회사],2) In ("전자","통신")→ 집계하기 전에 개별 레코드를 선별하는 조건이므로WHERECount(구매.구매일자)>=3→ 제품별로 묶은 뒤 계산된 구매건수에 대한 조건이므로HAVING
즉 Access 쿼리 디자인 화면의 요약 행으로 보면 [제조회사]를 이용한 조건 필드는 묶는 방법으로 두는 것이 아니라 **조건(Where)**으로 설정해야 합니다.
작성자 답안에서는 Right([제조회사],2)를 GROUP BY에 포함했기 때문에 제품을 단순히 제품명으로만 묶는 것이 아니라,
제품명 + 제조회사의 마지막 두 글자의 조합으로 묶게 됩니다. 따라서 정답과 쿼리 구조가 달라집니다. 데이터에 따라서는 결과까지 달라질 가능성도 있습니다.
올바른 SQL은 정답처럼 다음과 같습니다.
SELECT 제품.제품명,
Count(구매.구매일자) AS 구매건수,
Round(Avg([구매수량]),1) AS 평균구매,
Max(구매.구매금액) AS 최대금액
INTO 제품별구매내역
FROM 제품 INNER JOIN 구매
ON 제품.제품번호 = 구매.제품번호
WHERE Right([제조회사],2) In ("전자","통신")
GROUP BY 제품.제품명
HAVING Count(구매.구매일자)>=3
ORDER BY Max(구매.구매금액) DESC;따라서 이번 것은 단순한 자동채점상의 표현 차이라기보다는, WHERE에 들어가야 할 조건을 HAVING으로 처리하면서 불필요한 GROUP BY까지 추가한 쿼리 구조상의 오답으로 보는 것이 맞습니다.
쉽게 기억하면 **“원본 필드 조건 → WHERE, Count·Avg·Sum 같은 집계 결과 조건 → HAVING”**으로 구분하시면 됩니다.
즐거운 하루 되세요.
-
관리자2026-08-31 11:24:07
안녕하세요.
오답의 핵심은
Right([제조회사],2)조건을WHERE가 아니라GROUP BY + HAVING으로 처리한 것입니다.작성자 쿼리는 다음 구조입니다.
GROUP BY 제품.제품명, Right([제조회사],2) HAVING Count(구매.구매일자)>=3 AND Right([제조회사],2) In ("전자","통신")정답은 다음 구조입니다.
WHERE Right([제조회사],2) In ("전자","통신") GROUP BY 제품.제품명 HAVING Count(구매.구매일자)>=3여기서 두 조건의 성격이 다릅니다.
Right([제조회사],2) In ("전자","통신")→ 집계하기 전에 개별 레코드를 선별하는 조건이므로WHERECount(구매.구매일자)>=3→ 제품별로 묶은 뒤 계산된 구매건수에 대한 조건이므로HAVING
즉 Access 쿼리 디자인 화면의 요약 행으로 보면
[제조회사]를 이용한 조건 필드는묶는 방법으로 두는 것이 아니라 **조건(Where)**으로 설정해야 합니다.작성자 답안에서는
Right([제조회사],2)를GROUP BY에 포함했기 때문에 제품을 단순히제품명으로만 묶는 것이 아니라,제품명 + 제조회사의 마지막 두 글자의 조합으로 묶게 됩니다. 따라서 정답과 쿼리 구조가 달라집니다. 데이터에 따라서는 결과까지 달라질 가능성도 있습니다.
올바른 SQL은 정답처럼 다음과 같습니다.
SELECT 제품.제품명, Count(구매.구매일자) AS 구매건수, Round(Avg([구매수량]),1) AS 평균구매, Max(구매.구매금액) AS 최대금액 INTO 제품별구매내역 FROM 제품 INNER JOIN 구매 ON 제품.제품번호 = 구매.제품번호 WHERE Right([제조회사],2) In ("전자","통신") GROUP BY 제품.제품명 HAVING Count(구매.구매일자)>=3 ORDER BY Max(구매.구매금액) DESC;따라서 이번 것은 단순한 자동채점상의 표현 차이라기보다는,
WHERE에 들어가야 할 조건을HAVING으로 처리하면서 불필요한GROUP BY까지 추가한 쿼리 구조상의 오답으로 보는 것이 맞습니다.쉽게 기억하면 **“원본 필드 조건 → WHERE, Count·Avg·Sum 같은 집계 결과 조건 → HAVING”**으로 구분하시면 됩니다.
즐거운 하루 되세요.