mysql 쿼리 질문드리겠습니다. 0 2 572

by 밍밍밍밍 [MySQL] [2018.01.23 15:50:09]


code 테이블( 01~17까지 총 17개지역입니다.)

acode aname
01 서울
02 부산
03 대구
17 제주

Rcheck 테이블

association syear smonth menuid
01 2018 01 menu1
01 2018 01 menu3
02 2018 01 menu4
03 2018 02 menu5
04 2018 02 menu2

 

테이블2개를 조인을 해서 Rcheck테이블에 값이 있을 경우 Y로 표시를 하려고합니다.

 

select 
acode, aname, 
case when A.ACODE = B.association and B.MENUID = 'menu1' then 'Y' else 'N' end as menu1,
case when A.ACODE = B.association and B.MENUID = 'menu2' then 'Y' else 'N' end as menu2, 
case when A.ACODE = B.association and B.MENUID = 'menu3' then 'Y' else 'N' end as menu3,
case when A.ACODE = B.association and B.MENUID = 'menu4' then 'Y' else 'N' end as menu4,
case when A.ACODE = B.association and B.MENUID = 'menu5' then 'Y' else 'N' end as menu5,
case when A.ACODE = B.association and B.MENUID = 'menu6' then 'Y' else 'N' end as menu6,
case when A.ACODE = B.association and B.MENUID = 'menu7' then 'Y' else 'N' end as menu7,
case when A.ACODE = B.association and B.MENUID = 'menu8' then 'Y' else 'N' end as menu8,
case when A.ACODE = B.association and B.MENUID = 'menu9' then 'Y' else 'N' end as menu9
from code A
left join Rcheck B on A.acode = B.association 
and B.SYEAR = '2018' and B.SMONTH = '01'
group by acode

 

위 sql문으로 테스트를 해보고있는데 Rcheck테이블에서 01이 2개일경우

Y가 하나만 표시가 되는데..

어떻게 수정해야할지 조언좀 부탁드리겠습니다.

by 마농 [2018.01.23 16:14:34]

그룹바이 기준항목이 아닌 항목은 집계함수와 함께 사용해야 합니다.
집계함수 없이 단독으로 사용할 경우
mySQL 이 아닌 타 DBMS 에서는 아예 허용이 안됩니다. ==> 에러 발생
mySQL 에서는 이런 구문이 허용되는데
동작방식은 기준 별로 처음 읽히는 행의 값이 조회되는 듯 합니다.
즉, 하나의 값만 조회되는 거죠.
mySQL 의 특징을 알고서 이런 그룹바이 구문을 사용한다면 모를까?
그게 아니라면 이런 구문을 사용하는 것은 지양해야 합니다.
그룹바이 사용법에 맞게 범용 구문으로 고쳐 쓰셔야 합니다.
그룹바이 기준항목이 아닌 항목은 집계함수와 함께 사용해야 합니다.
 

SELECT a.acode
     , a.aname
     , MAX(CASE WHEN b.menuid = 'menu1' THEN 'Y' ELSE 'N' END) AS menu1
     , MAX(CASE WHEN b.menuid = 'menu2' THEN 'Y' ELSE 'N' END) AS menu2
     , MAX(CASE WHEN b.menuid = 'menu3' THEN 'Y' ELSE 'N' END) AS menu3
     , MAX(CASE WHEN b.menuid = 'menu4' THEN 'Y' ELSE 'N' END) AS menu4
     , MAX(CASE WHEN b.menuid = 'menu5' THEN 'Y' ELSE 'N' END) AS menu5
     , MAX(CASE WHEN b.menuid = 'menu6' THEN 'Y' ELSE 'N' END) AS menu6
     , MAX(CASE WHEN b.menuid = 'menu7' THEN 'Y' ELSE 'N' END) AS menu7
     , MAX(CASE WHEN b.menuid = 'menu8' THEN 'Y' ELSE 'N' END) AS menu8
     , MAX(CASE WHEN b.menuid = 'menu9' THEN 'Y' ELSE 'N' END) AS menu9
  FROM code a
  LEFT OUTER JOIN Rcheck b
    ON a.acode  = b.association
   AND b.syear  = '2018'
   AND b.smonth = '01'
 GROUP BY a.acode, a.aname
;

 


by 밍밍밍밍 [2018.01.23 16:45:21]

답변감사드립니다 해결했습니다..

그룹바이에 대해 하나 배웠습니다~

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