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가 하나만 표시가 되는데..
어떻게 수정해야할지 조언좀 부탁드리겠습니다.
그룹바이 기준항목이 아닌 항목은 집계함수와 함께 사용해야 합니다.
집계함수 없이 단독으로 사용할 경우
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 ;