[MySQL] select 결과의 로우 만큼 SELECT절에서 반복문 사용 방법 질문 드립니다 0 2 8,302

by 홍이 [MySQL] MySQL SQL 쿼리 [2018.10.15 17:37:16]


안녕하세요.

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

프로시저로 작성을 해야 할지 아니면 프로시저 없이도 다른 방법이 있는지

방법이 생각이 나지 않아서 질문 드립니다.

 

감사합니다

by 마농 [2018.10.15 19:09:50]

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
;

 


by 홍이 [2018.10.16 09:02:20]

답변 감사합니다!

작성해주신 내용 참고하여 쿼리 작성 해보겠습니다!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입