bennp
172
2020-09-21 12:49:24 작성 2020-09-21 12:58:10 수정됨
8
201

Mysql 쿼리문 조언부탁드립니다.


직원 테이블

emp_num

nameage
1park20
2kim23

스킬 테이블

emp_numskillorder
1C1
1Java2
1Python3
2C1


1번2번 직원들의 이름과 나이와 스킬들을 알아내고 싶습니다.이런식의 두개의 테이블이 존재할때 

emp_num   name    age    skill

1                 park        20      C     Java    Pyhon

2                 kim         23      C  

이런식의 결과를 얻고 싶은데 emp_num 을 기준으로 한줄로 받아오는 쿼리문을 작성 할 수 있을까요???

실질적인 요청은 C언어를 할줄 아는 직원의 정보를 가져오는데 이때 같이 직원이 어떤 스킬들을 보유하고 있는지에 대해서도 같이 가져오려고 합니다. 스킬들을 지닌 직원의 emp_num까지는 추출을 했는데 그 emp_num을 바탕으로 emp_num, name, age ,Skill들 을 받아오고 싶습니다......

!! 실제 테이블은 다른 형태 입니다 ㅠㅠ

0
  • 답변 8

  • web.
    684
    2020-09-21 13:30:31 작성 2020-09-21 13:32:15 수정됨

    WITH tmp1 AS

    ( SELECT '1' emp_num , 'C' skill , '1' "order"

    UNION ALL

    SELECT '1' emp_num , 'JAVA' skill , '2' "order"

    UNION ALL

    SELECT '1' emp_num , 'Python' skill , '3' "order"

    )

    , tmp2 AS

    (SELECT '1' emp_num ,

            'park' "NAME",

            '20' "AGE"

    )

     SELECT tmp2.*, a.skill1,a.skill2,a.skill3

     FROM (SELECT  emp_num,

    MAX(CASE WHEN "order" = '1' THEN skill ELSE '' END) skill1,

    MAX( CASE WHEN "order" = '2' THEN skill ELSE '' END) skill2,

    MAX( CASE WHEN "order" = '3' THEN skill ELSE '' END) skill3

           FROM     tmp1

           GROUP BY emp_num) a , tmp2 tmp2

    WHERE a.emp_num::TEXT = tmp2.emp_num::TEXT


    postgresql 로 작성하긴했는데.. 

    위처럼 피벗을해서 가로로 변환한다음  조인을 걸어도 되고요


    skill1,2,3 구분안짓고 컬럼 하나에 다나와도 된다면 listagg 라는것도 사용할 수 있겠네요. 



    결과물 보여드릴려고 했는데 사진파일이 안올라가네요. 

  • bennp
    172
    2020-09-21 13:33:35

    오홍 조언 감사합니다 !!! 서브 쿼리를 이용해서 작성해 보려구 하는데 역시 SQL은 아는것 같으면서도 뭔가 하려고 하면 모르는것 투성이네요 ㅠㅠ

  • 그만물어봐
    607
    2020-09-21 13:39:31 작성 2020-09-21 13:44:11 수정됨

    스킬 항목이 컬럼 형태로 뽑아야 한다면 web님 답변처럼


    스킬이 들어있는 수만큼 컬럼 형태를 만들면 됩니다.


    단 스킬 항목이 많다면 그만큼 쿼리도 길어지니


    dynamic sql 과 procedure 조합으로 만드는게 좋습니다.


    만약에


    스킬 항목들이 하나의 컬럼에 다 들어있어도 상관없다면


    mysql 같은 경우 버전에 따라 다를 수 있지만


    GROUP_CONCAT 이라는 좋은 함수가 있습니다.



    WITH TB_EMP AS
    (
    SELECT '1' AS EMP_NUM
    	  , 'PARK' AS NAME
    	  , '20' AS AGE
    UNION ALL
    SELECT '2' AS EMP_NUM
    	  , 'KIM' AS NAME
    	  , '23' AS AGE
    )
    , TB_SKILL AS
    (
    SELECT '1' AS EMP_NUM
    	  , 'C' AS SKILL
    	  , '1' AS ORDER_CD
    UNION ALL
    SELECT '1' AS EMP_NUM
    	  , 'JAVA' AS SKILL
    	  , '2' AS ORDER_CD
    UNION ALL
    SELECT '1' AS EMP_NUM
    	  , 'PYTHON' AS SKILL
    	  , '3' AS ORDER_CD
    UNION ALL
    SELECT '2' AS EMP_NUM
    	  , 'C' AS SKILL
    	  , '1' AS ORDER_CD
    )
    SELECT A.EMP_NUM AS EMP_NUM
    	  , A.NAME AS NAME
    	  , A.AGE AS AGE
    	  , GROUP_CONCAT(B.SKILL) AS SKILL
      FROM TB_EMP A
     INNER JOIN TB_SKILL B
    	 ON B.EMP_NUM = A.EMP_NUM
     GROUP BY A.EMP_NUM
    	  , A.NAME
    	  , A.AGE
     ORDER BY A.EMP_NUM
     	  , B.ORDER_CD


  • 개발가락
    183
    2020-09-21 13:46:39 작성 2020-09-21 19:52:04 수정됨


    select a.emp_num,a.name,a.age,group_concat(b.skill separator ' ') skill
    from emp a
    join skill b on a.emp_num=b.emp_num
    group by a.emp_num


    Order부분은 제외하고

    뭐 이런 식일 것 같은데요?


  • bennp
    172
    2020-09-21 13:57:05
    넵넵 group_cocat으로 성공하였습니다 ㅠㅠ 이제 order별로 출력하는것만 하면되네용 ㅠㅠㅠㅠ 모두 감사합니다!!!
  • 개발가락
    183
    2020-09-21 13:57:41 작성 2020-09-21 19:51:16 수정됨

    오 group_concat에 order도 들어있네요

    select a.emp_num,a.name,a.age,group_concat(b.skill order by b.order separator ' ') skill
    from emp a
    join skill b on a.emp_num=b.emp_num
    group by a.emp_num


  • 개발가락
    183
    2020-09-21 13:59:01

    덕분에 저도 공부가 되었습니다 :)

  • web.
    684
    2020-09-21 14:47:11

    oracle에서 listagg가 

    mysql에 group_concat이었네요 


    하나 알아갑니다. 

  • 로그인을 하시면 답변 을 등록할 수 있습니다.