반응형
반응형

출저 : 프로그래머스

 

 

String, Date

문제풀이

 

A1. UNION ALL 사용

SELECT DATE_FORMAT(SALES_DATE, '%Y-%m-%d') AS SALES_DATE,
PRODUCT_ID, USER_ID, SALES_AMOUNT 
FROM (SELECT SALES_DATE, PRODUCT_ID, USER_ID, SALES_AMOUNT 
             FROM ONLINE_SALE 
             UNION ALL
             SELECT SALES_DATE, PRODUCT_ID, NULL AS USER_ID, SALES_AMOUNT 
             FROM OFFLINE_SALE
             ) AS A
WHERE SALES_DATE LIKE '2022-03%'
ORDER BY SALES_DATE, PRODUCT_ID, USER_ID

 

 UNION : 중복제거 + 테이블 세로로 결합(위+ 아래)
 UNION ALL : 중복제거X + 테이블 세로로 결합(위+ 아래)


 

 

문제에 있는거 그대로 따라갔다. ONLINE_SALE에서 필요한거 그대로 가져오고, OFFLINE_SALE테이블에서 필요한거 그대로 가져오고 결합 (UNION은 위아래로 단순하게 붙이는 것이기 때문에 컬럼만 맞으면 나중에 지장은 없다)

OFFLINE_SALE 에서 USER_ID는 NULL로 하라고했기에 NULL을 중간에 넣어줬다

 

 

단순하게 붙이면 이런 결과가 나오고 이 테이블을 가지고 다시 조건출력하면 끝

 

최종쿼리

 

 

A2. WITH 사용

중간에 결합된 테이블을 바로가져왔지만 WITH 함수를 이용하여 테이블 지정후 작성해도 풀 수 있다

반응형
반응형

출저 : 프로그래머스

SELECT

문제풀이

 

A. JOIN 사용

SELECT A.ITEM_ID, A.ITEM_NAME, A.RARITY FROM ITEM_INFO AS A 
LEFT JOIN ITEM_TREE AS B ON A.ITEM_ID = B.PARENT_ITEM_ID
WHERE B.ITEM_ID IS NULL
ORDER BY A.ITEM_ID DESC

 


     

    N차세대 부모-자식관련 문제를 풀 땐 조인을 이용하여 생각해야한다. 그리고 이 문제는 문제에 두 테이블은 분리가 되어있는 것 처럼 보이지만 PARENT_ITEM_ID만 따로 분리했다고도 볼 수 있다. 그래서 어떻게 결합하냐에 따라 문제를 보다 쉽게 해석할 수 있게된다.

     

    처음에 ITEM_ID 는 자식, PARENT_ITEM_ID 는 부모를 의미하고있다.

    그렇다면 테이블 두개를 ON A.ID = B.PARENT_ITEM_ID 로 결합하게 된다면 부모-자식간 관계가 보인다

     

    두 테이블을 ON A.ID = B.PARENT_ITEM_ID 로 결합했을 경우

    좌측 A. ITEM_ID B.PARENT_ID 부모포지션으로 같아지고  

    B.PARENT_ID의 자식 B. ITEM_ID A. ITEM_ID의 자식으로 볼 수 있다.

     

    즉  아래와 같은 테이블로 볼 수 있다

     

    이 이후엔 업그레이드가 불가능한 조건 ( = 자식이 없는 부모, WHERE B.ITEM_ID IS NULL )을 구하면 된다

     

     

     

     

    아래문제는 비슷한 유형이므로 연계해서 풀어보면 도움이 될 것 같다.

    [프로그래머스/MYSQL] 대장균들의 자식의 수 구하기 :: 공기업 전산직을 위한 도서관

    반응형
    반응형

    ㅇ출저 : 프로그래머스

    SELECT

    문제풀이

     

    A. JOIN 사용

    SELECT A.ID, COUNT(B.ID) AS CHILD_COUNT FROM ECOLI_DATA AS A
    LEFT JOIN ECOLI_DATA AS B ON A.ID = B.PARENT_ID
    GROUP BY A.ID
    ORDER BY A.ID

     


       

      N차세대 자식수를 구할 땐 조인을 이용하여 생각해야한다 

      처음에 ID는 자식, PARENT_ID 는 부모를 의미하고있는데 문제에서 자식의 수를 구해야하므로  저 두 행 위치가 서로 바뀌어 정렬되어야한다. 그래서 JOIN을 할때 ON A.ID = B.PARENT_ID  을 하여 비교하면 쉽게 눈에 보인다

       

      좌측은 기본테이블 / 우측에 붙은테이블은 B.ID(자식), B.PARENT_ID(부모)로, 한눈에 파악하기위해 조인함 처

      조인할 당시 ON A.ID = B.PARENT_ID 로 조인을 했기때문에 좌측 A.IDB.PARENT_ID 부모 포지션으로 같아지고  

      B.PARENT_ID의 자식 B.IDA.ID의 자식으로 볼 수 있다

       

      즉  아래와 같은 테이블로 볼 수 있다

       

       

      그래서 GROUP BY 와 COUNT를 이용하여 결과를 출력할 수 있다. 

      (단 COUNT에서 COUNT(B.PARENT_ID) 를 입력해도 결과는 같지만 출력되는 테이블은 다르므로 유의)

       

       

       

       

      아래문제는 비슷한 유형이므로 연계해서 풀어보면 도움이 될 것 같다.

      [프로그래머스/MYSQL] 업그레이드 할 수 없는 아이템 구하기 :: 공기업 전산직을 위한 도서관

      반응형
      반응형

      출저 : 프로그래머스

      JOIN

      문제풀이

       

      A. UNION/ UNION ALL 사용

      SELECT A.FLAVOR FROM
      (SELECT * FROM FIRST_HALF
      UNION 
      SELECT * FROM JULY) AS A
      GROUP BY FLAVOR
      ORDER BY SUM(A.TOTAL_ORDER) DESC LIMIT 3

       

       UNION : 중복제거 + 테이블 세로로 결합(위+ 아래)
       UNION ALL : 중복제거X + 테이블 세로로 결합(위+ 아래)

       

       

       

      UNION(ALL)을 사용하니 문제정답률에 비해 난이도가 쉬웠다고 생각한(?) 문제.

      두 테이블 구성이 같고, 데이터도 상반기/7월로 나눠져있어 합쳐도 무방하다고 생각했음.

      실제로 결합 후 1~7월 합계테이블이 완성되어 조건에 맞는 쿼리 작성 하면 끝

       

      반응형
      반응형

      출저 : 프로그래머스

       

      String, date

      문제풀이

       

      A. CONCAT, WHERE사용

      SELECT CONCAT('/home/grep/src/',B.BOARD_ID,'/', B.FILE_ID, B.FILE_NAME,B.FILE_EXT) AS FILE_PATH  

      FROM USED_GOODS_FILE AS B 
      LEFT JOIN USED_GOODS_BOARD AS A ON A.BOARD_ID = B.BOARD_ID
      WHERE A.VIEWS = (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
      ORDER BY B.FILE_ID DESC

       

       → WHERE로 가장큰 조회수 조건 걸었음

       

      ※ CONCAT( a, b, c, .... ) : a, b, c ... 합쳐서 출력
       → 중간에 띄어쓰기나 기호 등은 ' ' 표시를 통해 추가하기

       

       

      반응형
      반응형

      출저 : 프로그래머스

       

       

      String, date

      문제풀이

       

      A. DATEDIFF, CASE, DATE_FORMAT 사용

      SELECT HISTORY_ID, CAR_ID, DATE_FORMAT(START_DATE, '%Y-%m-%d') AS START_DATE, 
      DATE_FORMAT(END_DATE, '%Y-%m-%d') AS END_DATE,
      CASE 

          WHEN DATEDIFF(END_DATE, START_DATE) >= 29 THEN '장기 대여'
          ELSE '단기 대여' END AS RENT_TYPE
      FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
      WHERE START_DATE LIKE '2022-09%'
      ORDER BY HISTORY_ID DESC

       

      ※ DATEDIFF(날짜1, 날짜2) : 날짜1 - 날짜2(일수만 계산)

      → 문제는 대여일 계산이므로 첫날도 포함해야함 따라서 +1을 추가로 넣어줘야함 

      ※ DATE_FROMAT(컬럼명, '%Y-%m-%d ) : 날짜타입변경

      ※ CASE WHEN 조건 THEN 결과 ......  (1)

      WHEN 조건 THEN 결과 ......  (2) 반복될경우 추가

      ELSE 결과 END  

       

       

       

       

      틀렸던 오답

      '장기 대여', '단기 대여' 를 '장기대여', '단기대여' 처럼 띄어쓰기를 안함....

      반응형

      + Recent posts

      // 기업0 D-Day (표지) // 기업1 D-Day