내가 원하는 조건은 다음과 같았다. MYSQL 의 WITH ROLLUP함수처럼 합계를 구하되 이 함수를 쓰지 않는 것이였다.
COUNT() 된 값의 SUM() 즉 SUM(COUNT()) 을 구하고 싶었다.
예시 쿼리는 다음과 같다.
SELECT
date_format(LEFT(CAST(REQDT AS UNSIGNED),8),'%Y-%m-%d') AS REQDT,
count(SVCE_DOMAIN) COUNTSVCE
FROM BC_HISTORY
GROUP BY date_format(LEFT(CAST(REQDT AS UNSIGNED),8),'%Y-%m-%d') WITH ROLLUP;
위 쿼리를 쓰면
REQDT | COUNTSVCE |
2020-11-24 | 3 |
2020-11-25 | 28 |
2020-11-26 | 414 |
2020-11-27 | 208 |
2020-11-30 | 115 |
2020-12-01 | 29 |
2020-12-02 | 156 |
2020-12-03 | 237 |
2020-12-04 | 52 |
2020-12-07 | 54 |
2020-12-10 | 22 |
2020-12-12 | 1 |
1322 |
위의 표에서 COUNT (SVCE_DOMAIN)의 별칭인 COUNTSVCE
으로 조회한 컬럼의 합이 출력된다.
(실제 합의 숫자는 정확하지 않다 깔끔한 데이터를 위해 null 행을 삭제했기 때문이지만 원리는 같다)
즉 WITH ROLLUP(MYSQL은 WITH 앞에 붙여주어야 한다) 를 쓰면 COUNTSVCE의 누적 합계값을 구할 수 있다.
그러나 위 쿼리에서 ROLLUP을 삭제하고 쿼리를 출력하게되면
REQDT | COUNTSVCE |
2020-11-24 | 3 |
2020-11-25 | 28 |
2020-11-26 | 414 |
2020-11-27 | 208 |
2020-11-30 | 115 |
2020-12-01 | 29 |
2020-12-02 | 156 |
2020-12-03 | 237 |
2020-12-04 | 52 |
2020-12-07 | 54 |
2020-12-10 | 22 |
2020-12-12 | 1 |
이와 같은 데이터가 나올 것이다.
나는 ROLLUP함수처럼 누적 합계값을 구하는 것이 목적이었다.
즉 이미 SELECT절에서 GROUP BY로 묶인 값의 COUNT 된 값의 SUM을 구하면 되는 것이었다.
그 해결쿼리는 다음과 같다.
SELECT SUM(count) AS SUMPLE
FROM (
SELECT
date_format(LEFT(CAST(REQDT AS UNSIGNED),8),'%Y-%m-%d') AS REQDT,
count(SVCE_DOMAIN) as count
FROM BC_HISTORY
group by date_format(LEFT(CAST(REQDT AS UNSIGNED),8),'%Y-%m-%d')) AS COUNT
이렇게 작성하게되면 1322 값 한 열만 출력된다. (위의 ROLLUP을 사용한 값과 같은 값이 도출된다)
즉 단순히 보자면 SUM(COUNTSVCE) 값을 구해준 것이다.
이런식으로 뼈대를 잡고 적으면 된다
```
SELECT SUM(합을 구할 COUNT된 컬럼별칭)
FROM(메인 쿼리) AS 별칭
```
으로 적어주면되는데, 여기서 중요한점은 메인쿼리 안의
1. count(SVCE_DOMAIN) as count 이부분에서 as count처럼 별칭을 정해주어야 한다는 점과
2. 서브쿼리 마지막 ...%Y-%m-%d')) AS COUNT 에도 별칭을 달아줘야 에러가 안뜬 다는 것이다.
여기에 별칭 안달아주면 ERRORCODE 1248 발생함
(총 2군데 별칭)
간단하지만 막상 짤려고하면 기억이 안나거나 에러가 발생하는 쿼리인것 같다.