<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>Jonghyeok &amp;middot; Data Log</title>
    <link>https://jonghyeok-1.tistory.com/</link>
    <description>데이터분석 취업과정 기술블로그 입니다.</description>
    <language>ko</language>
    <pubDate>Thu, 11 Jun 2026 17:28:40 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>Jonghyeok</managingEditor>
    <image>
      <title>Jonghyeok &amp;middot; Data Log</title>
      <url>https://tistory1.daumcdn.net/tistory/7175854/attach/d869d30dc3d7446d98b62640b04529ee</url>
      <link>https://jonghyeok-1.tistory.com</link>
    </image>
    <item>
      <title>15.프로그래머스 SQL Lv.4 (자동차 대여 기록 별 대여 금액 구하기)</title>
      <link>https://jonghyeok-1.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;다음은&amp;nbsp;어느&amp;nbsp;자동차&amp;nbsp;대여&amp;nbsp;회사에서&amp;nbsp;대여&amp;nbsp;중인&amp;nbsp;자동차들의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;CAR_RENTAL_COMPANY_CAR&amp;nbsp;테이블과&amp;nbsp;자동차&amp;nbsp;대여&amp;nbsp;기록&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;CAR_RENTAL_COMPANY_RENTAL_HISTORY&amp;nbsp;테이블과&amp;nbsp;자동차&amp;nbsp;종류&amp;nbsp;별&amp;nbsp;대여&amp;nbsp;기간&amp;nbsp;종류&amp;nbsp;별&amp;nbsp;할인&amp;nbsp;정책&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;CAR_RENTAL_COMPANY_DISCOUNT_PLAN&amp;nbsp;테이블&amp;nbsp;입니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CAR_RENTAL_COMPANY_CAR&amp;nbsp;테이블은&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;구조로&amp;nbsp;되어있으며,&amp;nbsp;CAR_ID,&amp;nbsp;CAR_TYPE,&amp;nbsp;DAILY_FEE,&amp;nbsp;OPTIONS&amp;nbsp;는&amp;nbsp;각각&amp;nbsp;자동차&amp;nbsp;ID,&amp;nbsp;자동차&amp;nbsp;종류,&amp;nbsp;일일&amp;nbsp;대여&amp;nbsp;요금(원),&amp;nbsp;자동차&amp;nbsp;옵션&amp;nbsp;리스트를&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;260&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bLfvBZ/dJMcaarSOMJ/GR3X4QQ2cnPIH4pC0ww4Q0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bLfvBZ/dJMcaarSOMJ/GR3X4QQ2cnPIH4pC0ww4Q0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bLfvBZ/dJMcaarSOMJ/GR3X4QQ2cnPIH4pC0ww4Q0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbLfvBZ%2FdJMcaarSOMJ%2FGR3X4QQ2cnPIH4pC0ww4Q0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;521&quot; height=&quot;260&quot; data-origin-width=&quot;521&quot; data-origin-height=&quot;260&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;자동차&amp;nbsp;종류는&amp;nbsp;'세단',&amp;nbsp;'SUV',&amp;nbsp;'승합차',&amp;nbsp;'트럭',&amp;nbsp;'리무진'&amp;nbsp;이&amp;nbsp;있습니다.&amp;nbsp;자동차&amp;nbsp;옵션&amp;nbsp;리스트는&amp;nbsp;콤마(',')로&amp;nbsp;구분된&amp;nbsp;키워드&amp;nbsp;리스트(예:&amp;nbsp;''열선시트,스마트키,주차감지센서'')로&amp;nbsp;되어있으며,&amp;nbsp;키워드&amp;nbsp;종류는&amp;nbsp;'주차감지센서',&amp;nbsp;'스마트키',&amp;nbsp;'네비게이션',&amp;nbsp;'통풍시트',&amp;nbsp;'열선시트',&amp;nbsp;'후방카메라',&amp;nbsp;'가죽시트'&amp;nbsp;가&amp;nbsp;있습니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CAR_RENTAL_COMPANY_RENTAL_HISTORY&amp;nbsp;테이블은&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;구조로&amp;nbsp;되어있으며,&amp;nbsp;HISTORY_ID,&amp;nbsp;CAR_ID,&amp;nbsp;START_DATE,&amp;nbsp;END_DATE&amp;nbsp;는&amp;nbsp;각각&amp;nbsp;자동차&amp;nbsp;대여&amp;nbsp;기록&amp;nbsp;ID,&amp;nbsp;자동차&amp;nbsp;ID,&amp;nbsp;대여&amp;nbsp;시작일,&amp;nbsp;대여&amp;nbsp;종료일을&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;256&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/xdSRx/dJMcaii7nkr/3fJTwDx3u5PqvLSZOBmdk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/xdSRx/dJMcaii7nkr/3fJTwDx3u5PqvLSZOBmdk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/xdSRx/dJMcaii7nkr/3fJTwDx3u5PqvLSZOBmdk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FxdSRx%2FdJMcaii7nkr%2F3fJTwDx3u5PqvLSZOBmdk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;432&quot; height=&quot;256&quot; data-origin-width=&quot;432&quot; data-origin-height=&quot;256&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CAR_RENTAL_COMPANY_DISCOUNT_PLAN&amp;nbsp;테이블은&amp;nbsp;아래와&amp;nbsp;같은&amp;nbsp;구조로&amp;nbsp;되어있으며,&amp;nbsp;PLAN_ID,&amp;nbsp;CAR_TYPE,&amp;nbsp;DURATION_TYPE,&amp;nbsp;DISCOUNT_RATE&amp;nbsp;는&amp;nbsp;각각&amp;nbsp;요금&amp;nbsp;할인&amp;nbsp;정책&amp;nbsp;ID,&amp;nbsp;자동차&amp;nbsp;종류,&amp;nbsp;대여&amp;nbsp;기간&amp;nbsp;종류,&amp;nbsp;할인율(%)을&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t65cJ/dJMcahq0O2X/SWyvlrOpSgH483DKKAbfkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t65cJ/dJMcahq0O2X/SWyvlrOpSgH483DKKAbfkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t65cJ/dJMcahq0O2X/SWyvlrOpSgH483DKKAbfkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft65cJ%2FdJMcahq0O2X%2FSWyvlrOpSgH483DKKAbfkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;541&quot; height=&quot;259&quot; data-origin-width=&quot;541&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;할인율이&amp;nbsp;적용되는&amp;nbsp;대여&amp;nbsp;기간&amp;nbsp;종류로는&amp;nbsp;'7일&amp;nbsp;이상'&amp;nbsp;(대여&amp;nbsp;기간이&amp;nbsp;7일&amp;nbsp;이상&amp;nbsp;30일&amp;nbsp;미만인&amp;nbsp;경우),&amp;nbsp;'30일&amp;nbsp;이상'&amp;nbsp;(대여&amp;nbsp;기간이&amp;nbsp;30일&amp;nbsp;이상&amp;nbsp;90일&amp;nbsp;미만인&amp;nbsp;경우),&amp;nbsp;'90일&amp;nbsp;이상'&amp;nbsp;(대여&amp;nbsp;기간이&amp;nbsp;90일&amp;nbsp;이상인&amp;nbsp;경우)&amp;nbsp;이&amp;nbsp;있습니다.&amp;nbsp;대여&amp;nbsp;기간이&amp;nbsp;7일&amp;nbsp;미만인&amp;nbsp;경우&amp;nbsp;할인정책이&amp;nbsp;없습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CAR_RENTAL_COMPANY_CAR&amp;nbsp;테이블과&amp;nbsp;CAR_RENTAL_COMPANY_RENTAL_HISTORY&amp;nbsp;테이블과&amp;nbsp;CAR_RENTAL_COMPANY_DISCOUNT_PLAN&amp;nbsp;테이블에서&amp;nbsp;자동차&amp;nbsp;종류가&amp;nbsp;'트럭'인&amp;nbsp;자동차의&amp;nbsp;대여&amp;nbsp;기록에&amp;nbsp;대해서&amp;nbsp;대여&amp;nbsp;기록&amp;nbsp;별로&amp;nbsp;대여&amp;nbsp;금액(컬럼명:&amp;nbsp;FEE)을&amp;nbsp;구하여&amp;nbsp;대여&amp;nbsp;기록&amp;nbsp;ID와&amp;nbsp;대여&amp;nbsp;금액&amp;nbsp;리스트를&amp;nbsp;출력하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;결과는&amp;nbsp;대여&amp;nbsp;금액을&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬하고,&amp;nbsp;대여&amp;nbsp;금액이&amp;nbsp;같은&amp;nbsp;경우&amp;nbsp;대여&amp;nbsp;기록&amp;nbsp;ID를&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.대여 기간 문제의 기본 : 대여 종료일 - 대여 시작일에 +1 해주기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.WITH 절 사용 : 트럭의 대여 기록과 대여 일수를 임시 테이블로 정리 해두기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3.조건부 조인 : 대여 일수에 따라 할인 정책 테이블의 DURATION_TYPE 매칭&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4.결제 금액 산출 : 일일 대여 요금 * 대여 한 일수 *(1-할인율) 을 계산하고 정수로 출력&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. &lt;b&gt;WITH&lt;/b&gt; RENTAL_DATA AS ( ... )&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: 메인 쿼리를 작성하기 전에 필요한 데이터만 뽑아두는 가상 테이블(CTE) 생성 (코드가 길어지기때문에)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. &lt;b&gt;DATEDIFF&lt;/b&gt;(H.END_DATE, H.START_DATE) + 1&lt;b&gt; AS&lt;/b&gt; DURATION &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: 대여 한 기간을 일 단위로 계산. 시작일 당일도 포함해야해서 +1을 무조건 해야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. &lt;b&gt;WHERE&lt;/b&gt; C.CAR_TYPE = '트럭'&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: 문제 조건에 맞게 트럭 데이터만 먼저 보기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4.&lt;b&gt; ROUND&lt;/b&gt;(R.DAILY_FEE * R.DURATION * (100 - IFNULL(P.DISCOUNT_RATE, 0)) / 100) &lt;b&gt;AS&lt;/b&gt; FEE &lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: IFNULL(P.DISCOUNT_RATE, 0)&lt;b&gt;:&lt;/b&gt; 7일 미만의 대여라서 할인 정책 테이블과 매칭되지 않는 데이터(NULL)는 할인율을 0으로 처리, 할인율을 계산해서 일일 요금과 대여 일수를 곱하고 ROUND 함수로 정수 부분만 남기기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;5. &lt;b&gt;LEFT JOIN&lt;/b&gt; CAR_RENTAL_COMPANY_DISCOUNT_PLAN P ON R.CAR_TYPE = P.CAR_TYPE AND P.DURATION_TYPE = CASE ... END&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: 조건에 맞춰 텍스트를 매칭하기 위해서LEFT JOIN &amp;amp; CASE WHEN 사용 , 조건에 맞지 않는 7일 미만의 데이터도 살리기 위해 LEFT JOIN 사용&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. &lt;b&gt;ORDER BY&lt;/b&gt; FEE DESC, R.HISTORY_ID DESC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;: 계산된 총 대여 금액을 기준으로 내림차순 정렬을 하고 금액이 똑같으면 대여기록 ID 가 큰 것부터 나오도록 2차 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;-- 트럭의 대여 기록과 대여 일수를 먼저 계산하는 임시 테이블 생성(CTE) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WITH&lt;/b&gt;&amp;nbsp;RENTAL_DATA&amp;nbsp;&lt;b&gt;AS&lt;/b&gt;&amp;nbsp;( &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SELECT&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;H.HISTORY_ID, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C.CAR_TYPE, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;C.DAILY_FEE, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;DATEDIFF(H.END_DATE,&amp;nbsp;H.START_DATE)&amp;nbsp;+&amp;nbsp;1&lt;b&gt;&amp;nbsp;AS&lt;/b&gt;&amp;nbsp;DURATION &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;CAR_RENTAL_COMPANY_RENTAL_HISTORY&amp;nbsp;H &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;JOIN&lt;/b&gt;&amp;nbsp;CAR_RENTAL_COMPANY_CAR&amp;nbsp;C&amp;nbsp;ON&amp;nbsp;H.CAR_ID&amp;nbsp;=&amp;nbsp;C.CAR_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;C.CAR_TYPE&amp;nbsp;=&amp;nbsp;'트럭' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;) &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;-- 계산된 대여 일수를 바탕으로 할인율을 적용하여 최종 요금 산출 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;R.HISTORY_ID, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ROUND(R.DAILY_FEE&amp;nbsp;*&amp;nbsp;R.DURATION&amp;nbsp;*&amp;nbsp;(100&amp;nbsp;-&amp;nbsp;IFNULL(P.DISCOUNT_RATE,&amp;nbsp;0))&amp;nbsp;/&amp;nbsp;100)&amp;nbsp;&lt;b&gt;AS&amp;nbsp;&lt;/b&gt;FEE &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&amp;nbsp;&lt;/b&gt;RENTAL_DATA&amp;nbsp;R &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;LEFT&amp;nbsp;JOIN&lt;/b&gt;&amp;nbsp;CAR_RENTAL_COMPANY_DISCOUNT_PLAN&amp;nbsp;P&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;ON&lt;/b&gt;&amp;nbsp;R.CAR_TYPE&amp;nbsp;=&amp;nbsp;P.CAR_TYPE&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;AND&amp;nbsp;&lt;/b&gt;P.DURATION_TYPE&amp;nbsp;=&amp;nbsp;&lt;b&gt;CASE&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;WHEN&lt;/b&gt;&amp;nbsp;R.DURATION&amp;nbsp;&amp;gt;=&amp;nbsp;90&amp;nbsp;&lt;b&gt;THEN&lt;/b&gt;&amp;nbsp;'90일&amp;nbsp;이상' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHEN&lt;/b&gt;&amp;nbsp;R.DURATION&amp;nbsp;&amp;gt;=&amp;nbsp;30&amp;nbsp;&lt;b&gt;THEN&lt;/b&gt;&amp;nbsp;'30일&amp;nbsp;이상' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHEN&lt;/b&gt;&amp;nbsp;R.DURATION&amp;nbsp;&amp;gt;=&amp;nbsp;7&amp;nbsp;&lt;b&gt;THEN&lt;/b&gt;&amp;nbsp;'7일&amp;nbsp;이상' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;ELSE&amp;nbsp;NULL&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;END&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;FEE&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;,&amp;nbsp;R.HISTORY_ID&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;솔직히 이번 문제는 Lv3 문제를 많이 다뤄 봤다고 생각해서 레벨을 올려서 풀어 보았지만 전에 풀던 문제랑은 차원이 다르게 복잡했다. 처음에는 그냥 3개의 테이블을 join 하고 수식걸면 끝나겠지 했는데 결과 값에서 7일 미만 단기 대여 데이터들이 누락되었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;원인이 뭘까 했는데 할인 정책이 아예 없는 7일 미만 데이터를 생각 하지 않고 그냥 join 을 걸어버린게 원인 이였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;전에 풀던 문제에서 배운 동적 조인(LEFT JOIN)을 걸고 ON 조건절 안에 CASE WHEN 을 넣어 대여 일수 구간 별로 매칭 조건을 다르게 주어야 오류없이 답변을 작성할 수 있었다.&amp;nbsp; 이번 문제에는 시간이 굉장히 소모 되었지만 잊고 있었던 문법들을 실전에서 사용해보는 좋은 기회였던 문제였다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#Lv4#</category>
      <category>자동차 대여 기록 별 대여 금액 구하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/45</guid>
      <comments>https://jonghyeok-1.tistory.com/45#entry45comment</comments>
      <pubDate>Fri, 22 May 2026 16:25:32 +0900</pubDate>
    </item>
    <item>
      <title>14.프로그래머스 SQL Lv.3 (없어진 기록 찾기)</title>
      <link>https://jonghyeok-1.tistory.com/44</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ANIMAL_INS&amp;nbsp;테이블은&amp;nbsp;동물&amp;nbsp;보호소에&amp;nbsp;들어온&amp;nbsp;동물의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;ANIMAL_INS&amp;nbsp;테이블&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ANIMAL_ID,&amp;nbsp;ANIMAL_TYPE,&amp;nbsp;DATETIME,&amp;nbsp;INTAKE_CONDITION,&amp;nbsp;NAME,&amp;nbsp;SEX_UPON_INTAKE는&amp;nbsp;각각&amp;nbsp;동물의&amp;nbsp;아이디,&amp;nbsp;생물&amp;nbsp;종,&amp;nbsp;보호&amp;nbsp;시작일,&amp;nbsp;보호&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;상태,&amp;nbsp;이름,&amp;nbsp;성별&amp;nbsp;및&amp;nbsp;중성화&amp;nbsp;여부를&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;369&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bM88PG/dJMcahkdkA2/qUsVCp9vfNRtVOTerS23cK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bM88PG/dJMcahkdkA2/qUsVCp9vfNRtVOTerS23cK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bM88PG/dJMcahkdkA2/qUsVCp9vfNRtVOTerS23cK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbM88PG%2FdJMcahkdkA2%2FqUsVCp9vfNRtVOTerS23cK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;605&quot; height=&quot;369&quot; data-origin-width=&quot;605&quot; data-origin-height=&quot;369&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ANIMAL_OUTS&amp;nbsp;테이블은&amp;nbsp;동물&amp;nbsp;보호소에서&amp;nbsp;입양&amp;nbsp;보낸&amp;nbsp;동물의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;ANIMAL_OUTS&amp;nbsp;테이블&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ANIMAL_ID,&amp;nbsp;ANIMAL_TYPE,&amp;nbsp;DATETIME,&amp;nbsp;NAME,&amp;nbsp;SEX_UPON_OUTCOME는&amp;nbsp;각각&amp;nbsp;동물의&amp;nbsp;아이디,&amp;nbsp;생물&amp;nbsp;종,&amp;nbsp;입양일,&amp;nbsp;이름,&amp;nbsp;성별&amp;nbsp;및&amp;nbsp;중성화&amp;nbsp;여부를&amp;nbsp;나타냅니다.&amp;nbsp;ANIMAL_OUTS&amp;nbsp;테이블의&amp;nbsp;ANIMAL_ID는&amp;nbsp;ANIMAL_INS의&amp;nbsp;ANIMAL_ID의&amp;nbsp;외래&amp;nbsp;키입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;307&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/t2cjK/dJMcahRYC1W/fU6XcL5r6Nj5lQYRIkgtk1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/t2cjK/dJMcahRYC1W/fU6XcL5r6Nj5lQYRIkgtk1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/t2cjK/dJMcahRYC1W/fU6XcL5r6Nj5lQYRIkgtk1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Ft2cjK%2FdJMcahRYC1W%2FfU6XcL5r6Nj5lQYRIkgtk1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;609&quot; height=&quot;307&quot; data-origin-width=&quot;609&quot; data-origin-height=&quot;307&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;천재지변으로&amp;nbsp;인해&amp;nbsp;일부&amp;nbsp;데이터가&amp;nbsp;유실되었습니다.&amp;nbsp;입양을&amp;nbsp;간&amp;nbsp;기록은&amp;nbsp;있는데,&amp;nbsp;보호소에&amp;nbsp;들어온&amp;nbsp;기록이&amp;nbsp;없는&amp;nbsp;동물의&amp;nbsp;ID와&amp;nbsp;이름을&amp;nbsp;ID&amp;nbsp;순으로&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 입양을 간 기록(ANIMAL_OUTS)은 무조건 존재하므로, ANIMAL_OUTS를 왼쪽에 두고 LEFT JOIN 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 양쪽의 테이블의 동물 ID가 보호소 들어온 테이블(ANIMAL_INS)에 없다면, 두 테이블을 합쳤을 때 보호소 테이블의 컬럼들은 전부 NULL로 채워진다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. WHERE AI.ANIMAL_ID IS NULL 조건을 주어 유실된 데이터만 필터링.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. 동물의 ID 순으로 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. &lt;b&gt;SELECT&lt;/b&gt; AO.ANIMAL_ID, AO.NAME&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;결과에 나올 동물의 ID 와 이름 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;보호소 테이블(AI)의 데이터는 비어있는 상태이므로, AO 의 컬럼을 지정&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. &lt;b&gt;FROM&lt;/b&gt; ANIMAL_OUTS AO &lt;b&gt;LEFT JOIN&lt;/b&gt; ANIMAL_INS AI&lt;b&gt; ON&lt;/b&gt; AO.ANIMAL_ID = AI.ANIMAL_ID&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b data-index-in-node=&quot;0&quot; data-path-to-node=&quot;15,0,0&quot;&gt;LEFT JOIN&lt;/b&gt;: 왼쪽 테이블(ANIMAL_OUTS)의 모든 데이터에서, 고유 번호(ANIMAL_ID)가 일치하는 데이터를 오른쪽 테이블(ANIMAL_INS)에서 찾아와 가로로 합친다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;이때 매칭되는 데이터가 오른쪽 테이블에 없으면, 오른쪽 테이블의 컬럼 공간은&amp;nbsp; NULL로 채워지게 된다.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. &lt;b&gt;WHERE&lt;/b&gt; AI.ANIMAL_ID&lt;b&gt; IS NULL&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;조인한 결과 중에서 보호소 입소 기록 테이블(AI)의 ID 자리가 NULL로 비어있는 데이터만 필터링.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. &lt;b&gt;ORDER BY&lt;/b&gt; AO.ANIMAL_ID ASC;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;동물의 아이디 알파벳/숫자 순서대로 오름차순 정렬&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt;&amp;nbsp;AO.ANIMAL_ID,&amp;nbsp;AO.NAME &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;ANIMAL_OUTS&amp;nbsp;AO &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;LEFT&amp;nbsp;JOIN&lt;/b&gt;&amp;nbsp;ANIMAL_INS&amp;nbsp;AI&lt;b&gt;&amp;nbsp;ON&lt;/b&gt;&amp;nbsp;AO.ANIMAL_ID&amp;nbsp;=&amp;nbsp;AI.ANIMAL_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;AI.ANIMAL_ID&lt;b&gt;&amp;nbsp;IS&amp;nbsp;NULL&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;AO.ANIMAL_ID&amp;nbsp;ASC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt; LEFT JOIN과 IS NULL 조건의 조합을 활용하면 집합 개념의 차집합을 구현 할 수 있다는 점을 배웠다. 매우 유용하게 쓰일 수 있는 조건의 조합인거 같다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#Lv3#없어진 기록 찾기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/44</guid>
      <comments>https://jonghyeok-1.tistory.com/44#entry44comment</comments>
      <pubDate>Tue, 19 May 2026 12:53:57 +0900</pubDate>
    </item>
    <item>
      <title>13.프로그래머스 SQL Lv.3 (부서별 평균 연봉 조회하기)</title>
      <link>https://jonghyeok-1.tistory.com/43</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;HR_DEPARTMENT&amp;nbsp;테이블은&amp;nbsp;회사의&amp;nbsp;부서&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;HR_DEPARTMENT&amp;nbsp;테이블의&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;DEPT_ID,&amp;nbsp;DEPT_NAME_KR,&amp;nbsp;DEPT_NAME_EN,&amp;nbsp;LOCATION은&amp;nbsp;각각&amp;nbsp;부서&amp;nbsp;ID,&amp;nbsp;국문&amp;nbsp;부서명,&amp;nbsp;영문&amp;nbsp;부서명,&amp;nbsp;부서&amp;nbsp;위치를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;255&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bIZIED/dJMcacXseBu/8IDkBEDb7P1qKYk2KVBBc0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bIZIED/dJMcacXseBu/8IDkBEDb7P1qKYk2KVBBc0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bIZIED/dJMcacXseBu/8IDkBEDb7P1qKYk2KVBBc0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbIZIED%2FdJMcacXseBu%2F8IDkBEDb7P1qKYk2KVBBc0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;493&quot; height=&quot;255&quot; data-origin-width=&quot;493&quot; data-origin-height=&quot;255&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;HR_EMPLOYEES&amp;nbsp;테이블은&amp;nbsp;회사의&amp;nbsp;사원&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;HR_EMPLOYEES&amp;nbsp;테이블의&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;EMP_NO,&amp;nbsp;EMP_NAME,&amp;nbsp;DEPT_ID,&amp;nbsp;POSITION,&amp;nbsp;EMAIL,&amp;nbsp;COMP_TEL,&amp;nbsp;HIRE_DATE,&amp;nbsp;SAL은&amp;nbsp;각각&amp;nbsp;사번,&amp;nbsp;성명,&amp;nbsp;부서&amp;nbsp;ID,&amp;nbsp;직책,&amp;nbsp;이메일,&amp;nbsp;전화번호,&amp;nbsp;입사일,&amp;nbsp;연봉을&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;466&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lfCud/dJMcajhXoVQ/B1XbIv9FQMFITjkuZbMSAk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lfCud/dJMcajhXoVQ/B1XbIv9FQMFITjkuZbMSAk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lfCud/dJMcajhXoVQ/B1XbIv9FQMFITjkuZbMSAk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlfCud%2FdJMcajhXoVQ%2FB1XbIv9FQMFITjkuZbMSAk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;464&quot; height=&quot;466&quot; data-origin-width=&quot;464&quot; data-origin-height=&quot;466&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;HR_DEPARTMENT와&amp;nbsp;HR_EMPLOYEES&amp;nbsp;테이블을&amp;nbsp;이용해&amp;nbsp;부서별&amp;nbsp;평균&amp;nbsp;연봉을&amp;nbsp;조회하려&amp;nbsp;합니다.&amp;nbsp;부서별로&amp;nbsp;부서&amp;nbsp;ID,&amp;nbsp;영문&amp;nbsp;부서명,&amp;nbsp;평균&amp;nbsp;연봉을&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;평균연봉은&amp;nbsp;소수점&amp;nbsp;첫째&amp;nbsp;자리에서&amp;nbsp;반올림하고&amp;nbsp;컬럼명은&amp;nbsp;AVG_SAL로&amp;nbsp;해주세요. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;결과는&amp;nbsp;부서별&amp;nbsp;평균&amp;nbsp;연봉을&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬해주세요. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 부서 정보(HR_DEPARTMENT)와 사원 정보(HR_EMPLOYEES)를 DEPT_ID 기준으로 합친다. (&lt;b&gt;JOIN&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 부서 ID와 영문 부서명을 기준으로 데이터를 그룹화 한다. (&lt;b data-index-in-node=&quot;45&quot; data-path-to-node=&quot;4,1,0&quot;&gt;GROUP BY&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3.AVG(SAL) 로 평균을 구하고, 조건에 맞게 ROUND(..., 0) 함수 사용 (첫째 자리 반올림)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4.평균 연봉을 기준으로 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. &lt;b&gt;SELECT&lt;/b&gt; HD.DEPT_ID, HD.DEPT_NAME_EN,&amp;nbsp; ROUND(AVG(HE.SAL), 0) AS AVG_SAL&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;부서 ID, 영문 부서명과 함께 계산된 평균 연봉을 선택&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;AVG(HE.SAL): 그룹화된 부서원들의 연봉(SAL) 평균을 구한다.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ROUND(..., 0): 소수점 첫째 자리에서 반올림&amp;nbsp;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.&lt;b&gt;FROM&lt;/b&gt; HR_DEPARTMENT HD JOIN HR_EMPLOYEES HE ON HD.DEPT_ID = HE.DEPT_ID&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;부서의 영문 이름과 사원들의 연봉 정보가 분리되어 있으므로, 부서 코드 고유값인 DEPT_ID를 매핑 키로 잡아 결합&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. &lt;b&gt;GROUP BY&lt;/b&gt; HD.DEPT_ID, HD.DEPT_NAME_EN&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;AVG같은 집계 함수를 사용할 때 집계 하지 않는 일반 컬럼은 반드시 GROUP BY 절에 모두 명시 &lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. 평균 연봉 수치가 높은 부서 부터 위에 나오도록 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HD.DEPT_ID,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;HD.DEPT_NAME_EN,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ROUND(&lt;b&gt;AVG&lt;/b&gt;(HE.SAL),&amp;nbsp;0)&amp;nbsp;&lt;b&gt;AS&amp;nbsp;&lt;/b&gt;AVG_SAL &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&amp;nbsp;&lt;/b&gt;HR_DEPARTMENT&amp;nbsp;HD &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;JOIN&amp;nbsp;&lt;/b&gt;HR_EMPLOYEES&amp;nbsp;HE&lt;b&gt;&amp;nbsp;ON&lt;/b&gt;&amp;nbsp;HD.DEPT_ID&amp;nbsp;=&amp;nbsp;HE.DEPT_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;GROUP&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;HD.DEPT_ID,&amp;nbsp;HD.DEPT_NAME_EN &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;AVG_SAL&amp;nbsp;&lt;b&gt;DESC&lt;/b&gt;;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/43</guid>
      <comments>https://jonghyeok-1.tistory.com/43#entry43comment</comments>
      <pubDate>Tue, 19 May 2026 12:40:46 +0900</pubDate>
    </item>
    <item>
      <title>12.프로그래머스 SQL Lv.3 (즐겨찾기가 가장 많은 식당 정보 출력하기)</title>
      <link>https://jonghyeok-1.tistory.com/42</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;다음은&amp;nbsp;식당의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;REST_INFO&amp;nbsp;테이블입니다.&amp;nbsp;REST_INFO&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;REST_ID,&amp;nbsp;REST_NAME,&amp;nbsp;FOOD_TYPE,&amp;nbsp;VIEWS,&amp;nbsp;FAVORITES,&amp;nbsp;PARKING_LOT,&amp;nbsp;ADDRESS,&amp;nbsp;TEL은&amp;nbsp;식당&amp;nbsp;ID,&amp;nbsp;식당&amp;nbsp;이름,&amp;nbsp;음식&amp;nbsp;종류,&amp;nbsp;조회수,&amp;nbsp;즐겨찾기수,&amp;nbsp;주차장&amp;nbsp;유무,&amp;nbsp;주소,&amp;nbsp;전화번호를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;478&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/SLGr0/dJMcai4nRjW/10tSsHM3mOLKtdnAv3iPR0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/SLGr0/dJMcai4nRjW/10tSsHM3mOLKtdnAv3iPR0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/SLGr0/dJMcai4nRjW/10tSsHM3mOLKtdnAv3iPR0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FSLGr0%2FdJMcai4nRjW%2F10tSsHM3mOLKtdnAv3iPR0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;530&quot; height=&quot;478&quot; data-origin-width=&quot;530&quot; data-origin-height=&quot;478&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;REST_INFO&amp;nbsp;테이블에서&amp;nbsp;음식종류별로&amp;nbsp;즐겨찾기수가&amp;nbsp;가장&amp;nbsp;많은&amp;nbsp;식당의&amp;nbsp;음식&amp;nbsp;종류,&amp;nbsp;ID,&amp;nbsp;식당&amp;nbsp;이름,&amp;nbsp;즐겨찾기수를&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;이때&amp;nbsp;결과는&amp;nbsp;음식&amp;nbsp;종류를&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.음식 종류별 가장 많은 즐겨찾기 수 찾기 = FOOD_TYPE 으로 그룹화 하고 MAX(FAVORITES)를 구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.메인 쿼리의 (FOOD_TYPE, FAVORITES) 쌍이 서브쿼리에서 구한 (음식 종류, 최대 즐겨찾기수) 쌍과 일치하는 행만 필터링&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3.음식 종류를 기준으로 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;--&amp;nbsp; 틀린 답 (의도와 다르게 작동함) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&amp;nbsp;&lt;/b&gt;FOOD_TYPE,&amp;nbsp;REST_ID,&amp;nbsp;REST_NAME,&amp;nbsp;MAX(FAVORITES) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;REST_INFO &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;GROUP&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;FOOD_TYPE;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;처음에 필터링을 하지 않았더니 오류가 나서 알아보니&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;GROUP BY 특성상 집계되지 않은 나머지 컬럼들은 아무 데이터나 가져오기 때문에 서브쿼리를 통해 확실하게 필터링 해줘야한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.&lt;b&gt; SELECT&lt;/b&gt; FOOD_TYPE, REST_ID, REST_NAME, FAVORITES&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 최정 결과로 나올 음식 종류,식당 ID,이름,즐겨찾기 수 컬럼을 선택&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.&lt;b&gt;FROM&lt;/b&gt; REST_INFO WHERE (FOOD_TYPE, FAVORITES) IN (...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= REST_INFO 테이블에서 데이터를 조회하지만 &quot;음식종류와 즐겨찾기수 라는 2개의 컬럼 조합이 서브쿼리의 결과 안에 존재하는 행만 가져와라&quot; 라는 의미&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3.(&lt;b&gt;SELECT&lt;/b&gt; FOOD_TYPE, MAX(FAVORITES) &lt;b&gt;FROM&lt;/b&gt; REST_INFO &lt;b&gt;GROUP BY&lt;/b&gt; FOOD_TYPE)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 음식 종류 별로 그룹화 하고 각 음식 그룹에서 즐겨찾기 수가 가장 높은 점수를 추출&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4.음식 종류 글자를 기준으로 가다나 역순(내림차순) 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt;&amp;nbsp;FOOD_TYPE,&amp;nbsp;REST_ID,&amp;nbsp;REST_NAME,&amp;nbsp;FAVORITES &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&amp;nbsp;&lt;/b&gt;REST_INFO &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;(FOOD_TYPE,&amp;nbsp;FAVORITES)&lt;b&gt;&amp;nbsp;IN&lt;/b&gt;&amp;nbsp;( &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;SELECT&amp;nbsp;&lt;/b&gt;FOOD_TYPE,&amp;nbsp;MAX(FAVORITES) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;REST_INFO &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;GROUP&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;FOOD_TYPE &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;FOOD_TYPE&amp;nbsp;DESC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;처음에 접했던 오류가 GROUP BY 절에 집계 함수(MAX)를 쓰다가 엉뚱한 식당 ID와 매칭되는 현상인데, 이를 다중 컬럼 서브쿼리 IN (...) 문법으로 어떻게 안전하고 정확하게 해결할 수 있는지 다시 한번 상기 하게 되는 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#lv3#</category>
      <category>즐겨찾기가 가장 많은 식당 정보 출력하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/42</guid>
      <comments>https://jonghyeok-1.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 19 May 2026 12:23:25 +0900</pubDate>
    </item>
    <item>
      <title>11.프로그래머스 SQL Lv.3 (있었는데요 없었습니다)</title>
      <link>https://jonghyeok-1.tistory.com/41</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ANIMAL_INS&amp;nbsp;테이블은&amp;nbsp;동물&amp;nbsp;보호소에&amp;nbsp;들어온&amp;nbsp;동물의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;ANIMAL_INS&amp;nbsp;테이블&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ANIMAL_ID,&amp;nbsp;ANIMAL_TYPE,&amp;nbsp;DATETIME,&amp;nbsp;INTAKE_CONDITION,&amp;nbsp;NAME,&amp;nbsp;SEX_UPON_INTAKE는&amp;nbsp;각각&amp;nbsp;동물의&amp;nbsp;아이디,&amp;nbsp;생물&amp;nbsp;종,&amp;nbsp;보호&amp;nbsp;시작일,&amp;nbsp;보호&amp;nbsp;시작&amp;nbsp;시&amp;nbsp;상태,&amp;nbsp;이름,&amp;nbsp;성별&amp;nbsp;및&amp;nbsp;중성화&amp;nbsp;여부를&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;364&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RLMc5/dJMcabYzYzd/1hLdSv3BYCTc5M2XUax9W0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RLMc5/dJMcabYzYzd/1hLdSv3BYCTc5M2XUax9W0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RLMc5/dJMcabYzYzd/1hLdSv3BYCTc5M2XUax9W0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRLMc5%2FdJMcabYzYzd%2F1hLdSv3BYCTc5M2XUax9W0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;574&quot; height=&quot;364&quot; data-origin-width=&quot;574&quot; data-origin-height=&quot;364&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ANIMAL_OUTS&amp;nbsp;테이블은&amp;nbsp;동물&amp;nbsp;보호소에서&amp;nbsp;입양&amp;nbsp;보낸&amp;nbsp;동물의&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;테이블입니다.&amp;nbsp;ANIMAL_OUTS&amp;nbsp;테이블&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ANIMAL_ID,&amp;nbsp;ANIMAL_TYPE,&amp;nbsp;DATETIME,&amp;nbsp;NAME,&amp;nbsp;SEX_UPON_OUTCOME는&amp;nbsp;각각&amp;nbsp;동물의&amp;nbsp;아이디,&amp;nbsp;생물&amp;nbsp;종,&amp;nbsp;입양일,&amp;nbsp;이름,&amp;nbsp;성별&amp;nbsp;및&amp;nbsp;중성화&amp;nbsp;여부를&amp;nbsp;나타냅니다.&amp;nbsp;ANIMAL_OUTS&amp;nbsp;테이블의&amp;nbsp;ANIMAL_ID는&amp;nbsp;ANIMAL_INS의&amp;nbsp;ANIMAL_ID의&amp;nbsp;외래&amp;nbsp;키입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;317&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/zs0Eo/dJMcaiDm53K/ygYztKQSMpxhz1eR7gZrg0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/zs0Eo/dJMcaiDm53K/ygYztKQSMpxhz1eR7gZrg0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/zs0Eo/dJMcaiDm53K/ygYztKQSMpxhz1eR7gZrg0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fzs0Eo%2FdJMcaiDm53K%2FygYztKQSMpxhz1eR7gZrg0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;611&quot; height=&quot;317&quot; data-origin-width=&quot;611&quot; data-origin-height=&quot;317&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;관리자의&amp;nbsp;실수로&amp;nbsp;일부&amp;nbsp;동물의&amp;nbsp;입양일이&amp;nbsp;잘못&amp;nbsp;입력되었습니다.&amp;nbsp;보호&amp;nbsp;시작일보다&amp;nbsp;입양일이&amp;nbsp;더&amp;nbsp;빠른&amp;nbsp;동물의&amp;nbsp;아이디와&amp;nbsp;이름을&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;이때&amp;nbsp;결과는&amp;nbsp;보호&amp;nbsp;시작일이&amp;nbsp;빠른&amp;nbsp;순으로&amp;nbsp;조회해야합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 동물의 입양 전 정보(ANIMAL_INS)와 입양 후 정보(ANIMAL_OUTS) 를 ANIMAL_ID 기준으로 테이블 결합(JOIN)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 들어온 날짜가 나간 날짜 보다 더 큰 경우를 찾는다 =필터링&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 보호 시작일 기준으로 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. &lt;b&gt;SELECT&lt;/b&gt; AI.ANIMAL_ID, AI.NAME&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 최종 결과물로 보여줄 아이디와 이름 선택하고 입양 테이블과 보호 테이블 모두에 존재하는 컬럼이므로, 정확하게 보호 테이블(AI)에서 가져오도록 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2&lt;b&gt;. FROM&lt;/b&gt; ANIMAL_INS AI &lt;b&gt;JOIN&lt;/b&gt; ANIMAL_OUTS AO ON AI.ANIMAL_ID = AO.ANIMAL_ID&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 동물의 보호 시작일과 입양일은 각각 다른 테이블에 저장되어 있기 때문에 두개를 한눈에 비교하기 위해서 고유번호를 매핑 조건(ON) 으로 삼아 테이블을 가로로 이어붙이기&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. &lt;b&gt;WHERE&lt;/b&gt; AI.DATETIME &amp;gt; AO.DATETIME&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 보호 시작일이 입양일 보다 미래로 잘못 입력된 데이터만 거르는 필터링 조건&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. 보호 시작일이 빠른 순서부터 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt;&amp;nbsp;AI.ANIMAL_ID,&amp;nbsp;AI.NAME &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;ANIMAL_INS&amp;nbsp;AI &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;JOIN&lt;/b&gt;&amp;nbsp;ANIMAL_OUTS&amp;nbsp;AO&amp;nbsp;ON&amp;nbsp;AI.ANIMAL_ID&amp;nbsp;=&amp;nbsp;AO.ANIMAL_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;AI.DATETIME&amp;nbsp;&amp;gt;&amp;nbsp;AO.DATETIME &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;AI.DATETIME&amp;nbsp;ASC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;데이터 분석을 시작하기 전에 데이터의 무결성 검증 로직을 먼저 수행해야 정확한 분석 결과를 도출 할 수 있겠다는 점을 배울 수 있는 문제였다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#Lv3#있었는데요 없었습니다</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/41</guid>
      <comments>https://jonghyeok-1.tistory.com/41#entry41comment</comments>
      <pubDate>Tue, 19 May 2026 12:07:37 +0900</pubDate>
    </item>
    <item>
      <title>10.프로그래머스 SQL Lv.3 (업그레이드 할 수 없는 아이템 구하기)</title>
      <link>https://jonghyeok-1.tistory.com/40</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;어느&amp;nbsp;한&amp;nbsp;게임에서&amp;nbsp;사용되는&amp;nbsp;아이템들은&amp;nbsp;업그레이드가&amp;nbsp;가능합니다. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;'ITEM_A'-&amp;gt;'ITEM_B'와&amp;nbsp;같이&amp;nbsp;업그레이드가&amp;nbsp;가능할&amp;nbsp;때 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;'ITEM_A'를&amp;nbsp;'ITEM_B'의&amp;nbsp;PARENT&amp;nbsp;아이템, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;PARENT&amp;nbsp;아이템이&amp;nbsp;없는&amp;nbsp;아이템을&amp;nbsp;ROOT&amp;nbsp;아이템이라고&amp;nbsp;합니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;예를&amp;nbsp;들어&amp;nbsp;'ITEM_A'-&amp;gt;'ITEM_B'-&amp;gt;'ITEM_C'&amp;nbsp;와&amp;nbsp;같이&amp;nbsp;업그레이드가&amp;nbsp;가능한&amp;nbsp;아이템이&amp;nbsp;있다면 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;'ITEM_C'의&amp;nbsp;PARENT&amp;nbsp;아이템은&amp;nbsp;'ITEM_B' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;'ITEM_B'의&amp;nbsp;PARENT&amp;nbsp;아이템은&amp;nbsp;'ITEM_A' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ROOT&amp;nbsp;아이템은&amp;nbsp;'ITEM_A'가&amp;nbsp;됩니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;다음은&amp;nbsp;해당&amp;nbsp;게임에서&amp;nbsp;사용되는&amp;nbsp;아이템&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;ITEM_INFO&amp;nbsp;테이블과&amp;nbsp;아이템&amp;nbsp;관계를&amp;nbsp;나타낸&amp;nbsp;ITEM_TREE&amp;nbsp;테이블입니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ITEM_INFO&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ITEM_ID,&amp;nbsp;ITEM_NAME,&amp;nbsp;RARITY,&amp;nbsp;PRICE는&amp;nbsp;각각&amp;nbsp;아이템&amp;nbsp;ID,&amp;nbsp;아이템&amp;nbsp;명,&amp;nbsp;아이템의&amp;nbsp;희귀도,&amp;nbsp;아이템의&amp;nbsp;가격을&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bAFGEW/dJMcacwpO9w/zDa9Mik5VnJ8ehIpBxjPkK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bAFGEW/dJMcacwpO9w/zDa9Mik5VnJ8ehIpBxjPkK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bAFGEW/dJMcacwpO9w/zDa9Mik5VnJ8ehIpBxjPkK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbAFGEW%2FdJMcacwpO9w%2FzDa9Mik5VnJ8ehIpBxjPkK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;494&quot; height=&quot;259&quot; data-origin-width=&quot;494&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ITEM_TREE&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;ITEM_ID,&amp;nbsp;PARENT_ITEM_ID는&amp;nbsp;각각&amp;nbsp;아이템&amp;nbsp;ID,&amp;nbsp;PARENT&amp;nbsp;아이템의&amp;nbsp;ID를&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;168&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b47zeL/dJMcabqJ1Mv/gFathGM7v3AVampslLwthk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b47zeL/dJMcabqJ1Mv/gFathGM7v3AVampslLwthk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b47zeL/dJMcabqJ1Mv/gFathGM7v3AVampslLwthk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb47zeL%2FdJMcabqJ1Mv%2FgFathGM7v3AVampslLwthk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;485&quot; height=&quot;168&quot; data-origin-width=&quot;485&quot; data-origin-height=&quot;168&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;단,&amp;nbsp;각&amp;nbsp;아이템들은&amp;nbsp;오직&amp;nbsp;하나의&amp;nbsp;PARENT&amp;nbsp;아이템&amp;nbsp;ID&amp;nbsp;를&amp;nbsp;가지며,&amp;nbsp;ROOT&amp;nbsp;아이템의&amp;nbsp;PARENT&amp;nbsp;아이템&amp;nbsp;ID&amp;nbsp;는&amp;nbsp;NULL&amp;nbsp;입니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;ROOT&amp;nbsp;아이템이&amp;nbsp;없는&amp;nbsp;경우는&amp;nbsp;존재하지&amp;nbsp;않습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;더&amp;nbsp;이상&amp;nbsp;업그레이드할&amp;nbsp;수&amp;nbsp;없는&amp;nbsp;아이템의&amp;nbsp;아이템&amp;nbsp;ID(ITEM_ID),&amp;nbsp;아이템&amp;nbsp;명(ITEM_NAME),&amp;nbsp;아이템의&amp;nbsp;희귀도(RARITY)를&amp;nbsp;출력하는&amp;nbsp;SQL&amp;nbsp;문을&amp;nbsp;작성해&amp;nbsp;주세요.&amp;nbsp;이때&amp;nbsp;결과는&amp;nbsp;아이템&amp;nbsp;ID를&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬해&amp;nbsp;주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 더이상 업그레이드 할 수 없다 =&amp;nbsp; 어떤 아이템이 부모(PARENT_ITEM_ID) 역할을 하고 있다면, 그 아이템은 업그레이드 가능&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;=&amp;nbsp; PARENT_ITEM_ID 리스트에 한 번도 등장하지 않는 ITEM_ID 가 더이상 업그레이드 할 수 없는 아이템&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 부모 아이템 ID 목록 구하기 = ITEM_TREE에서 PARENT_ITEM_ID들을 서브쿼리로 추출 (NULL 값 제외 필수)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 메인 쿼리에서 아이템 ID 가 위에서 구한 부모 ID 리스트에 포함되지 않는(NOT IN) 데이터만 필터링&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. &lt;b&gt;SELECT&lt;/b&gt; II.ITEM_ID, II.ITEM_NAME, II.RARITY&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 아이템 ID , 아이템 명 , 희귀도를 선택 테이블 이름 길어서 II 라는 별칭 붙임&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.&lt;b&gt; FROM&lt;/b&gt; ITEM_INFO II WHERE II.ITEM_ID NOT IN (...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= ITEM_INFO 테이블에서 데이터를 추출하지만 NOT IN(속하지 않는 아이템 ID 만 추출)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. (&lt;b&gt;SELECT&lt;/b&gt; PARENT_ITEM_ID &lt;b&gt;FROM&lt;/b&gt; ITEM_TREE WHERE PARENT_ITEM_ID&lt;b&gt; IS NOT NULL&lt;/b&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= ITEM_TREE 테이블에서 다른 아이템의 부모 역할을 하는 PARENT_ITEM_ID를 모은고 NULL 값을 걸러준다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELEC&lt;/b&gt;T&amp;nbsp;II.ITEM_ID,&amp;nbsp;II.ITEM_NAME,&amp;nbsp;II.RARITY &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;ITEM_INFO&amp;nbsp;II &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;II.ITEM_ID&amp;nbsp;NOT&amp;nbsp;IN&amp;nbsp;( &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;SELECT&lt;/b&gt;&amp;nbsp;PARENT_ITEM_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;FROM&lt;/b&gt;&amp;nbsp;ITEM_TREE &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;PARENT_ITEM_ID&amp;nbsp;&lt;b&gt;IS&amp;nbsp;NOT&amp;nbsp;NULL&lt;br /&gt;&lt;/b&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;II.ITEM_ID&amp;nbsp;DESC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NOT IN 사용할 떄 NULL 처리를 어떻게 하는지 배울 수 있는 문제였다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;서브 쿼리 결과에 NULL 이 단 하나라도 포함되어 있으면 NOT IN 쿼리가 정상 작동 하지않고 아무 데이터도 반환하지 않는다는 것을 배웠다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#SQL#프로그래머스#Lv3#</category>
      <category>업그레이드 할 수 없는 아이템 구하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/40</guid>
      <comments>https://jonghyeok-1.tistory.com/40#entry40comment</comments>
      <pubDate>Tue, 19 May 2026 11:56:11 +0900</pubDate>
    </item>
    <item>
      <title>9.프로그래머스 SQL lv.3 (조건별로 분류하여 주문상태 출력하기)</title>
      <link>https://jonghyeok-1.tistory.com/39</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;다음은&amp;nbsp;식품공장의&amp;nbsp;주문정보를&amp;nbsp;담은&amp;nbsp;FOOD_ORDER&amp;nbsp;테이블입니다.&amp;nbsp;FOOD_ORDER&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;ORDER_ID,&amp;nbsp;PRODUCT_ID,&amp;nbsp;AMOUNT,&amp;nbsp;PRODUCE_DATE,&amp;nbsp;IN_DATE,OUT_DATE,FACTORY_ID,&amp;nbsp;WAREHOUSE_ID는&amp;nbsp;각각&amp;nbsp;주문&amp;nbsp;ID,&amp;nbsp;제품&amp;nbsp;ID,&amp;nbsp;주문양,&amp;nbsp;생산일자,&amp;nbsp;입고일자,&amp;nbsp;출고일자,&amp;nbsp;공장&amp;nbsp;ID,&amp;nbsp;창고&amp;nbsp;ID를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;467&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lOWeS/dJMcaiDm4F6/V8JdwvH2OpsZvYyvG4BGfK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lOWeS/dJMcaiDm4F6/V8JdwvH2OpsZvYyvG4BGfK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lOWeS/dJMcaiDm4F6/V8JdwvH2OpsZvYyvG4BGfK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlOWeS%2FdJMcaiDm4F6%2FV8JdwvH2OpsZvYyvG4BGfK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;525&quot; height=&quot;467&quot; data-origin-width=&quot;525&quot; data-origin-height=&quot;467&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;FOOD_ORDER&amp;nbsp;테이블에서&amp;nbsp;2022년&amp;nbsp;5월&amp;nbsp;1일을&amp;nbsp;기준으로&amp;nbsp;주문&amp;nbsp;ID,&amp;nbsp;제품&amp;nbsp;ID,&amp;nbsp;출고일자,&amp;nbsp;출고여부를&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;출고여부는&amp;nbsp;2022년&amp;nbsp;5월&amp;nbsp;1일까지&amp;nbsp;출고완료로&amp;nbsp;이&amp;nbsp;후&amp;nbsp;날짜는&amp;nbsp;출고&amp;nbsp;대기로&amp;nbsp;미정이면&amp;nbsp;출고미정으로&amp;nbsp;출력해주시고,&amp;nbsp;결과는&amp;nbsp;주문&amp;nbsp;ID를&amp;nbsp;기준으로&amp;nbsp;오름차순&amp;nbsp;정렬해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 문제 예시 출력 형식을 보면 YYYY-MM-DD 형태이므로 DATE_FORMAT 함수를 사용.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. CASE WHEN 을 이용햇 2022년 5월 1일을 기준으로 3가지 조건을 나눈다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-path-to-node=&quot;4,1,1&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;OUT_DATE가 NULL이면&amp;nbsp; &lt;b data-index-in-node=&quot;20&quot; data-path-to-node=&quot;4,1,1,0,0&quot;&gt;출고미정&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;OUT_DATE가 2022-05-01 이하이면 &lt;b data-index-in-node=&quot;29&quot; data-path-to-node=&quot;4,1,1,1,0&quot;&gt;출고완료&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;그 외(2022-05-01 이후)이면 &lt;b data-index-in-node=&quot;24&quot; data-path-to-node=&quot;4,1,1,2,0&quot;&gt;출고대기&lt;/b&gt;&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.&lt;b&gt;SELECT&lt;/b&gt; ORDER_ID, PRODUCT_ID, DATE_FORMAT(OUT_DATE, '%Y-%m-%d') AS OUT_DATE&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 테이블 두개를 가져오고&amp;nbsp; DATE_FORMAT(OUT_DATE, '%Y-%m-%d') 를 이용해 YYYY-MM-DD 형식으로 포맷팅&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. CASE WHEN 문을 이용해 3가지 조건별 출력 여부 작성&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ORDER_ID,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;PRODUCT_ID,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;DATE_FORMAT&lt;/b&gt;(OUT_DATE,&amp;nbsp;'%Y-%m-%d')&lt;b&gt;&amp;nbsp;AS&lt;/b&gt;&amp;nbsp;OUT_DATE, &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;CASE&lt;/b&gt;&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;WHEN&lt;/b&gt;&amp;nbsp;OUT_DATE&amp;nbsp;&lt;b&gt;IS&amp;nbsp;NULL&amp;nbsp;THEN&lt;/b&gt;&amp;nbsp;'출고미정' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;WHEN&lt;/b&gt;&amp;nbsp;OUT_DATE&amp;nbsp;&amp;lt;=&amp;nbsp;'2022-05-01'&amp;nbsp;&lt;b&gt;THEN&lt;/b&gt;&amp;nbsp;'출고완료' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;&amp;nbsp;ELSE&lt;/b&gt;&amp;nbsp;'출고대기' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;END&amp;nbsp;AS&amp;nbsp;&lt;/b&gt;출고여부 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;FOOD_ORDER &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;ORDER_ID&amp;nbsp;ASC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;CASE WHEN 문을 사용할때 조건의 우선순위와 NULL 처리의 중요성을 배울 수 있었다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;NULL 체크를 먼저 하지 않고 날짜 비교를 먼저 했으면 데이터가 ELSE 조건으로 넘어가 출고대기로 잘못 분류되는 오류가 발생 할수있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#lv3#</category>
      <category>조건별로 분류하여 주문상태 출력하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/39</guid>
      <comments>https://jonghyeok-1.tistory.com/39#entry39comment</comments>
      <pubDate>Tue, 19 May 2026 11:41:54 +0900</pubDate>
    </item>
    <item>
      <title>8. 프로그래머스 SQL lv.3(조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기)</title>
      <link>https://jonghyeok-1.tistory.com/38</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;다음은&amp;nbsp;중고거래&amp;nbsp;게시판&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;테이블과&amp;nbsp;중고거래&amp;nbsp;게시판&amp;nbsp;첨부파일&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;USED_GOODS_FILE&amp;nbsp;테이블입니다.&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;BOARD_ID,&amp;nbsp;WRITER_ID,&amp;nbsp;TITLE,&amp;nbsp;CONTENTS,&amp;nbsp;PRICE,&amp;nbsp;CREATED_DATE,&amp;nbsp;STATUS,&amp;nbsp;VIEWS은&amp;nbsp;게시글&amp;nbsp;ID,&amp;nbsp;작성자&amp;nbsp;ID,&amp;nbsp;게시글&amp;nbsp;제목,&amp;nbsp;게시글&amp;nbsp;내용,&amp;nbsp;가격,&amp;nbsp;작성일,&amp;nbsp;거래상태,&amp;nbsp;조회수를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;457&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/yOcbp/dJMcac4cXUH/j2cGQyHIBYPQ4q6yghPWT1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/yOcbp/dJMcac4cXUH/j2cGQyHIBYPQ4q6yghPWT1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/yOcbp/dJMcac4cXUH/j2cGQyHIBYPQ4q6yghPWT1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FyOcbp%2FdJMcac4cXUH%2Fj2cGQyHIBYPQ4q6yghPWT1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;571&quot; height=&quot;457&quot; data-origin-width=&quot;571&quot; data-origin-height=&quot;457&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;USED_GOODS_FILE&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;FILE_ID,&amp;nbsp;FILE_EXT,&amp;nbsp;FILE_NAME,&amp;nbsp;BOARD_ID는&amp;nbsp;각각&amp;nbsp;파일&amp;nbsp;ID,&amp;nbsp;파일&amp;nbsp;확장자,&amp;nbsp;파일&amp;nbsp;이름,&amp;nbsp;게시글&amp;nbsp;ID를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;259&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cYLEht/dJMcaaFnRo9/QdXtJNq9w5iTt5QRswerVK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cYLEht/dJMcaaFnRo9/QdXtJNq9w5iTt5QRswerVK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cYLEht/dJMcaaFnRo9/QdXtJNq9w5iTt5QRswerVK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcYLEht%2FdJMcaaFnRo9%2FQdXtJNq9w5iTt5QRswerVK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;518&quot; height=&quot;259&quot; data-origin-width=&quot;518&quot; data-origin-height=&quot;259&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;USED_GOODS_BOARD와&amp;nbsp;USED_GOODS_FILE&amp;nbsp;테이블에서&amp;nbsp;조회수가&amp;nbsp;가장&amp;nbsp;높은&amp;nbsp;중고거래&amp;nbsp;게시물에&amp;nbsp;대한&amp;nbsp;첨부파일&amp;nbsp;경로를&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;첨부파일&amp;nbsp;경로는&amp;nbsp;FILE&amp;nbsp;ID를&amp;nbsp;기준으로&amp;nbsp;내림차순&amp;nbsp;정렬해주세요.&amp;nbsp;기본적인&amp;nbsp;파일경로는&amp;nbsp;/home/grep/src/&amp;nbsp;이며,&amp;nbsp;게시글&amp;nbsp;ID를&amp;nbsp;기준으로&amp;nbsp;디렉토리가&amp;nbsp;구분되고,&amp;nbsp;파일이름은&amp;nbsp;파일&amp;nbsp;ID,&amp;nbsp;파일&amp;nbsp;이름,&amp;nbsp;파일&amp;nbsp;확장자로&amp;nbsp;구성되도록&amp;nbsp;출력해주세요.&amp;nbsp;조회수가&amp;nbsp;가장&amp;nbsp;높은&amp;nbsp;게시물은&amp;nbsp;하나만&amp;nbsp;존재합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 파악&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 조회수가 가장 높은 게시글 찾기 (View 의 최댓값 확인)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 찾은 게시글의 BOARD_ID&amp;nbsp; 를 기준으로 두 테이블을 JOIN 한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 문제에 나온 경로대로 문자열을 결합해서 파일경로를 생성한다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;/home/grep/src/ + 게시글ID + / + 파일ID + 파일이름 + . + 확장자&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. FILE_ID 를 기준으로 내림차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;해결 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.&lt;b&gt;SELECT&lt;/b&gt; CONCAT('/home/grep/src/', B.BOARD_ID, '/', F.FILE_ID, F.FILE_NAME, '.', F.FILE_EXT) AS FILE_PATH&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= CONCAT 으로 여러 문자열을 하나로 이어붙이고 AS FILE_ PATH 로 문제조건에 맞게 컬럼명을 별칭으로 지정&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.&lt;b&gt;FROM&lt;/b&gt; USED_GOODS_BOARD B JOIN USED_GOODS_FILE F ON B.BOARD_ID = F.BOARD_ID&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 게시글 정보와 파일정보가 서로 다른 테이블에 있으므로 BOARD_ID 를 기준으로 두 테이블을 합친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. &lt;b&gt;WHERE&lt;/b&gt; B.VIEWS = (...)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= 전체 게시글 에서 가장 높은 조회수를 가진 게시글의 데이터만 골라냄&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. (&lt;b&gt;SELECT&lt;/b&gt; MAX(VIEWS) FROM USED_GOODS_BOARD)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;= USED_GOODS_BOARD 테이블에서 가장 높은 조회수를 하나의 숫자로 떨어뜨린다.(예시에서 250)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;5. DESC 로 내림차순 정렬\&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt;&amp;nbsp;CONCAT('/home/grep/src/',&amp;nbsp;B.BOARD_ID,&amp;nbsp;'/',&amp;nbsp;F.FILE_ID,&amp;nbsp;F.FILE_NAME,&amp;nbsp;'.',&amp;nbsp;F.FILE_EXT)&amp;nbsp;AS&amp;nbsp;FILE_PATH &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;B &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;JOIN&amp;nbsp;&lt;/b&gt;USED_GOODS_FILE&amp;nbsp;F&amp;nbsp;ON&amp;nbsp;B.BOARD_ID&amp;nbsp;=&amp;nbsp;F.BOARD_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&amp;nbsp;&lt;/b&gt;B.VIEWS&amp;nbsp;=&amp;nbsp;( &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;&amp;nbsp;SELEC&lt;/b&gt;T&amp;nbsp;MAX(VIEWS) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;USED_GOODS_BOARD &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;) &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&amp;nbsp;&lt;/b&gt;F.FILE_ID&amp;nbsp;DESC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;가장 높은 조회수를 찾기 위해서 MAX(VIEW)를 활용하는 방식을 복습하고, 조건에 맞춰서 CONCAT 함수를 다루는 디테일의 중요성을 배울 수 있는 문제였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터#데이터분석#프로그래머스#SQL#lv3#</category>
      <category>조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/38</guid>
      <comments>https://jonghyeok-1.tistory.com/38#entry38comment</comments>
      <pubDate>Tue, 19 May 2026 11:28:49 +0900</pubDate>
    </item>
    <item>
      <title>7.프로그래머스 SQL lv3 (물고기 종류 별 대어 찾기)</title>
      <link>https://jonghyeok-1.tistory.com/37</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;낚시앱에서&amp;nbsp;사용하는&amp;nbsp;FISH_INFO&amp;nbsp;테이블은&amp;nbsp;잡은&amp;nbsp;물고기들의&amp;nbsp;정보를&amp;nbsp;담고&amp;nbsp;있습니다.&amp;nbsp;FISH_INFO&amp;nbsp;테이블의&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;ID,&amp;nbsp;FISH_TYPE,&amp;nbsp;LENGTH,&amp;nbsp;TIME은&amp;nbsp;각각&amp;nbsp;잡은&amp;nbsp;물고기의&amp;nbsp;ID,&amp;nbsp;물고기의&amp;nbsp;종류(숫자),&amp;nbsp;잡은&amp;nbsp;물고기의&amp;nbsp;길이(cm),&amp;nbsp;물고기를&amp;nbsp;잡은&amp;nbsp;날짜를&amp;nbsp;나타냅니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dsfq5Z/dJMcahYFM6r/opivHwvszO5uDevq00HfDk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dsfq5Z/dJMcahYFM6r/opivHwvszO5uDevq00HfDk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dsfq5Z/dJMcahYFM6r/opivHwvszO5uDevq00HfDk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fdsfq5Z%2FdJMcahYFM6r%2FopivHwvszO5uDevq00HfDk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;452&quot; height=&quot;263&quot; data-origin-width=&quot;452&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;단,&amp;nbsp;잡은&amp;nbsp;물고기의&amp;nbsp;길이가&amp;nbsp;10cm&amp;nbsp;이하일&amp;nbsp;경우에는&amp;nbsp;LENGTH&amp;nbsp;가&amp;nbsp;NULL&amp;nbsp;이며,&amp;nbsp;LENGTH&amp;nbsp;에&amp;nbsp;NULL&amp;nbsp;만&amp;nbsp;있는&amp;nbsp;경우는&amp;nbsp;없습니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;FISH_NAME_INFO&amp;nbsp;테이블은&amp;nbsp;물고기의&amp;nbsp;이름에&amp;nbsp;대한&amp;nbsp;정보를&amp;nbsp;담고&amp;nbsp;있습니다.&amp;nbsp;FISH_NAME_INFO&amp;nbsp;테이블의&amp;nbsp;구조는&amp;nbsp;다음과&amp;nbsp;같으며,&amp;nbsp;FISH_TYPE,&amp;nbsp;FISH_NAME&amp;nbsp;은&amp;nbsp;각각&amp;nbsp;물고기의&amp;nbsp;종류(숫자),&amp;nbsp;물고기의&amp;nbsp;이름(문자)&amp;nbsp;입니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;160&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/btEIYI/dJMcabjTN5G/SBMrs9weEz45ydkpBCXRvK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/btEIYI/dJMcabjTN5G/SBMrs9weEz45ydkpBCXRvK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/btEIYI/dJMcabjTN5G/SBMrs9weEz45ydkpBCXRvK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbtEIYI%2FdJMcabjTN5G%2FSBMrs9weEz45ydkpBCXRvK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;461&quot; height=&quot;160&quot; data-origin-width=&quot;461&quot; data-origin-height=&quot;160&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;물고기&amp;nbsp;종류&amp;nbsp;별로&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;물고기의&amp;nbsp;ID,&amp;nbsp;물고기&amp;nbsp;이름,&amp;nbsp;길이를&amp;nbsp;출력하는&amp;nbsp;SQL&amp;nbsp;문을&amp;nbsp;작성해주세요. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;물고기의&amp;nbsp;ID&amp;nbsp;컬럼명은&amp;nbsp;ID,&amp;nbsp;이름&amp;nbsp;컬럼명은&amp;nbsp;FISH_NAME,&amp;nbsp;길이&amp;nbsp;컬럼명은&amp;nbsp;LENGTH로&amp;nbsp;해주세요. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;결과는&amp;nbsp;물고기의&amp;nbsp;ID에&amp;nbsp;대해&amp;nbsp;오름차순&amp;nbsp;정렬해주세요. &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;단,&amp;nbsp;물고기&amp;nbsp;종류별&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;물고기는&amp;nbsp;1마리만&amp;nbsp;있으며&amp;nbsp;10cm&amp;nbsp;이하의&amp;nbsp;물고기가&amp;nbsp;가장&amp;nbsp;큰&amp;nbsp;경우는&amp;nbsp;없습니다. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 핵심&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1.FISH_INFO와 FISH_NAME_INFO를 FISH_TYPE 기준으로 합쳐야한다. (join 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2.물고기의 종류별로 가장 긴 길이를 찾아낸다. (Group by , Max 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3.찾아낸 가장 긴 길이를 가진 물고기의 ID 와 이름을 추출한다. (서브쿼리 활용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;SELECT 로 결국에 최종적으로 출력할 컬럼들 호출 SELECT FI.ID, FNI.FISH_NAME, FI.LENGTH&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;-&amp;gt;Join 으로 두 테이블이 공통으로 가지고있는 FISH_TYPE 을 key 로 삼아서 데이터를 합친다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;-&amp;gt; &lt;b&gt;WHERE 을 이용해서 가장 큰 물고기만 필터링(그냥 MAX(LENGTH)만 사용하면 ID 를 정확히 집어오기 힘들기때문)&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;그 후 오름차순 정렬해서 마무리&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt; SELECT&lt;/b&gt; FI.ID, FNI.FISH_NAME, FI.LENGTH&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt; FISH_INFO FI&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;JOIN&lt;/b&gt; FISH_NAME_INFO FNI ON FI.FISH_TYPE = FNI.FISH_TYPE&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt; (FI.FISH_TYPE, FI.LENGTH)&lt;b&gt; IN &lt;/b&gt;(&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&lt;/b&gt; FISH_TYPE, MAX(LENGTH)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt; FISH_INFO&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;GROUP BY&lt;/b&gt; FISH_TYPE&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER BY&lt;/b&gt; FI.ID ASC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;단순히 JOIN 만 하는게아니고 서브쿼리를 활용해서 그룹 내 최댓값의 전체 정보를 찾아내는 것이 핵심인 문제였다.&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터분석#데이터#SQL#프로그래머스#Lv3#물고기 종류 별 대어 찾기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/37</guid>
      <comments>https://jonghyeok-1.tistory.com/37#entry37comment</comments>
      <pubDate>Mon, 11 May 2026 22:58:36 +0900</pubDate>
    </item>
    <item>
      <title>6. 프로그래머스 SQL lv.3 ( 조건에 맞는 사용자와 총 거래금액 조회하기 )</title>
      <link>https://jonghyeok-1.tistory.com/36</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&amp;nbsp;설명 &lt;br /&gt;&lt;/b&gt;다음은&amp;nbsp;중고&amp;nbsp;거래&amp;nbsp;게시판&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;테이블과&amp;nbsp;중고&amp;nbsp;거래&amp;nbsp;게시판&amp;nbsp;사용자&amp;nbsp;정보를&amp;nbsp;담은&amp;nbsp;USED_GOODS_USER&amp;nbsp;테이블입니다.&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;BOARD_ID,&amp;nbsp;WRITER_ID,&amp;nbsp;TITLE,&amp;nbsp;CONTENTS,&amp;nbsp;PRICE,&amp;nbsp;CREATED_DATE,&amp;nbsp;STATUS,&amp;nbsp;VIEWS는&amp;nbsp;게시글&amp;nbsp;ID,&amp;nbsp;작성자&amp;nbsp;ID,&amp;nbsp;게시글&amp;nbsp;제목,&amp;nbsp;게시글&amp;nbsp;내용,&amp;nbsp;가격,&amp;nbsp;작성일,&amp;nbsp;거래상태,&amp;nbsp;조회수를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;460&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b25aA0/dJMcaiwsZjb/1Pw9ZRHMKDfUYJPzFy3Ln0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b25aA0/dJMcaiwsZjb/1Pw9ZRHMKDfUYJPzFy3Ln0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b25aA0/dJMcaiwsZjb/1Pw9ZRHMKDfUYJPzFy3Ln0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb25aA0%2FdJMcaiwsZjb%2F1Pw9ZRHMKDfUYJPzFy3Ln0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;546&quot; height=&quot;460&quot; data-origin-width=&quot;546&quot; data-origin-height=&quot;460&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;USED_GOODS_USER&amp;nbsp;테이블은&amp;nbsp;다음과&amp;nbsp;같으며&amp;nbsp;USER_ID,&amp;nbsp;NICKNAME,&amp;nbsp;CITY,&amp;nbsp;STREET_ADDRESS1,&amp;nbsp;STREET_ADDRESS2,&amp;nbsp;TLNO는&amp;nbsp;각각&amp;nbsp;회원&amp;nbsp;ID,&amp;nbsp;닉네임,&amp;nbsp;시,&amp;nbsp;도로명&amp;nbsp;주소,&amp;nbsp;상세&amp;nbsp;주소,&amp;nbsp;전화번호를&amp;nbsp;를&amp;nbsp;의미합니다.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignLeft&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;360&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/U8OQg/dJMcahRRuDF/y1HKw6oIk5OMG40kqsSS40/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/U8OQg/dJMcahRRuDF/y1HKw6oIk5OMG40kqsSS40/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/U8OQg/dJMcahRRuDF/y1HKw6oIk5OMG40kqsSS40/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FU8OQg%2FdJMcahRRuDF%2Fy1HKw6oIk5OMG40kqsSS40%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;599&quot; height=&quot;360&quot; data-origin-width=&quot;599&quot; data-origin-height=&quot;360&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;USED_GOODS_BOARD와&amp;nbsp;USED_GOODS_USER&amp;nbsp;테이블에서&amp;nbsp;완료된&amp;nbsp;중고&amp;nbsp;거래의&amp;nbsp;총금액이&amp;nbsp;70만&amp;nbsp;원&amp;nbsp;이상인&amp;nbsp;사람의&amp;nbsp;회원&amp;nbsp;ID,&amp;nbsp;닉네임,&amp;nbsp;총거래금액을&amp;nbsp;조회하는&amp;nbsp;SQL문을&amp;nbsp;작성해주세요.&amp;nbsp;결과는&amp;nbsp;총거래금액을&amp;nbsp;기준으로&amp;nbsp;오름차순&amp;nbsp;정렬해주세요.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;문제 해결 사고 과정&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;'&lt;b&gt;거래 완료&lt;/b&gt;' 상태인 데이터들을 '&lt;b&gt;사용자별&lt;/b&gt;'로 합산하고, '&lt;b&gt;특정 금액&lt;/b&gt;'이상 인 경우만 필터링 해야함&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;1. 테이블 합치기 = 게시글 정보와 사용자 정보가 나뉘어 있어서 ID 를 기준으로 두 테이블을 합쳐야 한다.(JOIN)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;2. 필터링 = 모든 거래가 아니고 거래완료된 것만 골라내야 한다.(WHERE)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;3. 그룹화 = 한 사람이 많이 거래했을 수 있어서, 회원별로 그룹화 하고 가격을 더해 총 거래금액을 구한다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;4. HAVING 조건 으로 합산된 금액이 70만원 이상인 사람만 남긴다.(집계 함수여서 HAVING 사용)&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;5. ORDER&amp;nbsp; BY 로 오름차순 정렬&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;답변&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;SELECT&amp;nbsp;&lt;/b&gt; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;U.USER_ID,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;U.NICKNAME,&amp;nbsp; &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SUM(B.PRICE)&amp;nbsp;AS&amp;nbsp;TOTAL_SALES &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;FROM&lt;/b&gt;&amp;nbsp;USED_GOODS_BOARD&amp;nbsp;B &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;JOIN&amp;nbsp;&lt;/b&gt;USED_GOODS_USER&amp;nbsp;U&amp;nbsp;ON&amp;nbsp;B.WRITER_ID&amp;nbsp;=&amp;nbsp;U.USER_ID &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;WHERE&lt;/b&gt;&amp;nbsp;B.STATUS&amp;nbsp;=&amp;nbsp;'DONE' &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;GROUP&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;U.USER_ID,&amp;nbsp;U.NICKNAME &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;HAVING&amp;nbsp;&lt;/b&gt;TOTAL_SALES&amp;nbsp;&amp;gt;=&amp;nbsp;700000 &lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;ORDER&amp;nbsp;BY&lt;/b&gt;&amp;nbsp;TOTAL_SALES&amp;nbsp;ASC;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;&lt;b&gt;학습 후기&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;이번 문제는&amp;nbsp; 그동안 풀어 왔던 GROUP BY와 HAVING 사용 예시에 그룹화 하기전에 WHERE 절로 조건을 건후&amp;nbsp;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffffff;&quot;&gt;그룹화 --&amp;gt; HAVING 절을 사용하는게 인상적이였다.&amp;nbsp;&lt;/span&gt;&lt;/p&gt;</description>
      <category>프로그래머스 SQL</category>
      <category>데이터분석#SQL#프로그래머스#데이터#lv3#조건에 맞는 사용자와 총 거래금액 조회하기</category>
      <author>Jonghyeok</author>
      <guid isPermaLink="true">https://jonghyeok-1.tistory.com/36</guid>
      <comments>https://jonghyeok-1.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 8 May 2026 17:28:50 +0900</pubDate>
    </item>
  </channel>
</rss>