작성
·
627
0
안녕하세요, count(distinct) 구문을 사용하려고 할 때마다 해당 오류가 발생합니다.
limit의 경우도 오류가 발생하여 구글링해보니 SQLServer에서는 top을 사용한다고 하여 문제를 해결하였는데, count(distinct)에 대해서는 문제 해결방법을 찾지 못해 질문 드립니다.
또한, 같은 실습 환경에서 실행하였는데 왜 저는 limit이 작동하지 않는 등 문제가 발생하는 것인지도 궁금하여 질문드립니다.
감사합니다.
답변 1
0
안녕하세요 지은님, 시간써서 질문 남겨주셔서 감사합니다.
ORDER BY가 작동하지 않는 것과 LIMIT이 작동하지 않는 두 가지로 질문 주신 것으로 이해하고 답변을 남길게요.
1.
ORDER BY가 작동하지 않는 원인은, ORDER BY절 내에서는 count.. 등의 함수를 사용할 수가 없기 때문입니다. 아래 방법을 단계별로 따라 주시면 좋을 것 같은데요,
--> count(distinct CustomerID) 뒤에 as cnt 등으로 원하는 별칭을 설정해주신 뒤
--> ORDER BY cnt 로 다시 정렬 수행
--> (혹은) ORDER BY 2 와 같이 컬럼 순서에 해당하는 값을 설정하여 정렬
아마 GROUP BY에서 count 함수를 작성해도 작동이 되는 것을 보셨거나, 컬럼명과 동일한 개념으로 그대로 count(distinct CustomerID)를 작성해주셨을 수 있을 것 같은데요, ORDER BY절에서는 함수명, 혹은 as를 통해 별칭으로 설정해준 명칭, 컬럼의 인덱스(순서)를 통해서만 컬럼 정렬이 가능합니다.
그리고 그 원인은 컴퓨터가 SQL을 실행하는 순서와 연관이 있습니다. 아래를 참고해주시면 이해에 도움이 될 것 같아요.
< SQL의 실행 순서 >
SELECT … ⑤
FROM … ①
WHERE … ②
GROUP BY … ③
HAVING … ④
ORDER BY … ⑥
위와 같이 SELECT 절은 FROM > WHERE > GROUP BY를 거치며 로우 데이터를 모으고 필터링하고 그루핑해서 연산을 할 준비를 하게 됩니다. 그리고 그 이후에 SELECT이 실행되면서 저희가 작성해주었던 count() 등의 함수들이 실행되고 계산값이 나오게 됩니다. 저희 예시에서는 GROUP BY를 국가별로 지정을 해주었으니 여기서는 국가별 회원수 카운팅이 이 지점에서 이루어집니다.
ORDER BY가 실행되는 순서는 바로 이 다음인데요, 이미 SELECT절이 실행되면서 컴퓨터의 자원을 써서 다 계산해둔 상태이기 때문에 컴퓨터는 이미 나온 결과값을 정렬하는 작업만을 할 수 있도록 SQL상 설계가 되어있습니다.
count(distinct CustomerID)를 ORDER BY에 넣어줄 경우 만약 이게 실행이 가능하다면 이미 SELECT절에서 계산한 값들을 단지 정렬을 위해서 컴퓨터가 다시 계산을 해줘야 합니다. 중복 연산이 발생하게 되는 것이죠. 이런 연산 낭비를 방지하기 위해서 ORDER BY에서는 위와 같이 컬럼명/별칭/인덱스만 사용할 수 있도록 되어있습니다. 이 셋 중 하나를 넣어주시면 잘 작동할거에요.
2
혹시 싶어 LIMIT의 경우에는 방금 테스트를 해보았는데 일단은 실습환경 사이트에서는 작동을 하는 것으로 보입니다.
LIMIT을 작성해주신 순서나, 사이트 환경이 다른 것일까 싶은데요, LIMIT이 작동하지 않는다고 말씀주신 해당 쿼리를 공유해주실 수 있을까요?
쿼리 공유주시면 확인해보도록 하겠습니다 :)
감사합니다.
안녕하세요.
LIMIT부분은 해당 사이트의 사파리 브라우져의 호환성 문제인 것 같습니다.
크롬 브라우저에서 동일 쿼리 수행시 정상 작동 확인됩니다.
실습 환경시 Chrome 브라우져 사용해주시면 감사하겠습니다.
ORDER BY 쿼리문은 아래와 같이 사용해주시면 됩니다.
감사합니다:)
안녕하세요, 답변 감사합니다.
저는 safari에서 실습 환경을 작동시켜 하고 있는데, 이렇게 에러가 뜨고 있습니다.
select top 10 *
from customers
;
로 작성했을 때는 문제없이 작동됩니다.
count(distinct)가 해결이 안되어서 불편을 겪고 있어 혹시 해결책을 아신다면 조언 부탁드리겠습니다. 감사합니다.