안녕하세요.
MySQL에서 반복문을 사용 하려면 프로시저를 사용 해야 하는건가요??
아직 MySQL에서 반복문을 사용 하지 않아 감이 잡히지 않아서 질문 드리게 되었습니다.
아래 데이터가 있는 테이블에서
reg_date | value |
2018-10-21 | 1 |
2018-10-23 | 2 |
2018-10-28 | 3 |
2018-10-30 | 4 |
2018-11-05 | 3 |
select
DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') AS ym,
value
from
test_st
where
DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') = '2018-10-01'
[결과]
ym | value |
2018-10-01 | 2 |
2018-10-01 | 1 |
2018-10-01 | 3 |
2018-10-01 | 4 |
조회 결과 로우의 갯수만큼 SELECT절에서 COUNT 부분에서 반복문을 실행 하고 싶습니다.
select
DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') AS ym,
-- 이부분에서 아래 COUNT 처럼 반복문 사용 하고 싶습니다. 조회 결과의 로우갯수 만큼 아래 COUNT를 반복하고 싶습니다.
COUNT(
IF(DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') = '2018-10-01' AND value = 1,reg_date,null)
) AS cnt1,
COUNT(
IF(DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') = '2018-10-01' AND value = 2,reg_date,null)
) AS cnt2,
COUNT(
IF(DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') = '2018-10-01' AND value = 3,reg_date,null)
) AS cnt3,
COUNT(
IF(DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') = '2018-10-01' AND value = 4,reg_date,null)
) AS cnt4
from
test_st
프로시저로 작성을 해야 할지 아니면 프로시저 없이도 다른 방법이 있는지
방법이 생각이 나지 않아서 질문 드립니다.
감사합니다
1. 반복해서 사용되는 복잡한 구문은
- 인라인뷰를 이용해 구문을 간소화 할 수 있습니다.
- 알리아스를 이용해 간단하게 기술하세요.
2. if 문 안의 조건은
- 공통되는 조건은 Where 절에 한번만 기술하고
- 각기다른 조건만 If 문 쓰면 됩니다.
3. 컬럼을 가변으로 할 수는 없습니다
- 고정값, 고정갯수로 가져가야 합니다.
- 가변 컬럼을 원한다면? 동적쿼리로 구현해야 합니다.
WITH test_st AS ( SELECT '2018-10-21' reg_date, 1 value UNION ALL SELECT '2018-10-23', 2 UNION ALL SELECT '2018-10-28', 3 UNION ALL SELECT '2018-10-30', 4 UNION ALL SELECT '2018-11-05', 3 ) SELECT ym , COUNT(CASE WHEN value = 1 THEN 1 END) cnt_1 , COUNT(CASE WHEN value = 2 THEN 1 END) cnt_2 , COUNT(CASE WHEN value = 3 THEN 1 END) cnt_3 , COUNT(CASE WHEN value = 4 THEN 1 END) cnt_4 , COUNT(CASE WHEN value = 5 THEN 1 END) cnt_5 FROM (SELECT DATE_FORMAT(reg_date + INTERVAL (4 -DAYOFWEEK(reg_date)) DAY, '%Y-%m-01') AS ym , value FROM test_st ) a WHERE ym = '2018-10-01' GROUP BY ym ;