본문 바로가기

DB/Programmers SQL Kit

[My_SQL] Lv.5 멸종위기의 대장균 찾기 문제  프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 이전에 아래 글처럼 특정 세대의 대장균을 찾은 적이 있다. 이때 서브쿼리를 재귀처리하여 사용했었는데 문제를 보자마자 일단 재귀로 각 세대를 다 찾아야겠구나 생각이 들었는데 또 다시 코드 노가다를 해야하나 싶었다.그러다가 RECURSIVE라는 재귀용 함수를 찾았다. (효자다 효자)RECURSIVE를 통해 각 대장균의 세대를 다 구해주니 너무 편하게 원하는 테이블을 만들었다.이후 해당 테이블을 셀프 조인하고 세대별로 그룹화 한 뒤 문제를 해결했다. [My_SQL] 특정 세대의 대장균 찾기문제 무식하게 데이터를.. 더보기
[My_SQL] Lv.4 언어별 개발자 분류하기 문제  프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 처음엔 WITH절들을 이용해서 각 GRADE에 의해 하나하나 구한 뒤 UNION작업을 통해 합쳐주었지만 코드가 너무 길었고 비효율적이었다. 아래 블로그에서 좀 더 좋은 코드를 발견하여 공유한다. GROUP BY - [언어별 개발자 분류하기] _ LEVEL 4해당 문제는 원래 9주차에 풀었던 문제지만, 풀이 과정에 대한 자세한 설명이 필요해 따로 포스팅한다프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/276036[ 문제 ]S.. 더보기
[My_SQL] Lv.4 우유와 요거트가 담긴 장바구니 문제  처음 봤을 땐 이게 레벨 4? 라는 생각이 바로 들었다.NAME이 Milk인 경우와 Yogurt인 경우를 구해서 INTERSECT를 통해서 교집합인 CART_ID를 뽑아냈다.이후 다른 사람이 푼 것을 봤는데 이 방식도 재밌었다.NAME이 milk, Yogurt인 것들만 도출해서 cart_id를 기반으로 그룹화하고 중복제거한 NAME의 갯수가 2개인 것을 뽑아냈다. 이 방식도 흥미로워 둘 다 올려본다.코드SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Milk' INTERSECT SELECT CART_ID FROM CART_PRODUCTS WHERE NAME = 'Yogurt' ORDER BY 1 ASC; OR SELECT CART_ID FROM CART_PRO.. 더보기
[My_SQL] Lv.4 취소되지 않은 진료 예약 조회하기 문제  조인 두 번만 하면 되는 문제이다.우선 APPOINTMENT 테이블에서 2022년 4월 13일 진료기록 중 예약이 취소되지 않은 CS(흉부외과) 데이터만 도출했다.이후 해당 테이블에 PATIENT, DOCTOR 테이블을 각각의 ID를 기준으로 조인해주고 출력했다. 코드WITH NOT_CANCEL_CS_AT413 AS (     SELECT *     FROM APPOINTMENT     WHERE (APNT_CNCL_YN = 'N' AND            DATE_FORMAT(APNT_YMD, '%Y-%m-%d') = DATE_FORMAT('20220413', '%Y-%m-%d')) AND           MCDP_CD = 'CS' ) SELECT DISTINCT cna.APNT_NO, p... 더보기
[My_SQL] Lv.4 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 문제 DEPT 테이블은 굳이 쓸 필요가 없었다.HR_GRADE의 EMP_NO을 기준으로 그룹화하고 SCORE의 평균을 이용해 CASE문으로 등급과 보너스 비율을 계산한다.이후 해당 테이블과 EMP 테이블을 조인하여 급여의 보너스 비율을 계산한다. 코드 WITH SCORE AS (     SELECT EMP_NO,     CASE         WHEN AVG(SCORE) >= 96 THEN 'S'         WHEN AVG(SCORE) >= 90 THEN 'A'         WHEN AVG(SCORE) >= 80 THEN 'B'         ELSE 'C'     END AS 'GRADE',     CASE         WHEN AVG(SCORE) >= 96 THEN 20         WHEN.. 더보기
[My_SQL] Lv.3 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기 문제  우선 NULL일 길이를 다 10CM로 변경한 테이블을 생성하고 해당 테이블을 FISH_TYPE별로 그룹화하면서 AVG(LENGTH)가 33 이상인 값들만 살렸다. 코드 WITH FISH_INFO_NEW AS (     SELECT ID, FISH_TYPE, IFNULL(LENGTH, 10) AS 'LENGTH', TIME     FROM FISH_INFO ) SELECT COUNT(*) AS 'FISH_COUNT', MAX(LENGTH) AS 'MAX_LENGTH', FISH_TYPE FROM FISH_INFO_NEW GROUP BY FISH_TYPE HAVING AVG(LENGTH) >= 33 ORDER BY 3 ASC; 더보기
[My_SQL] Lv.3 조건에 맞는 사용자 정보 조회하기 문제 조인으로 처리를 해도 되지만 WITH로 작성한 글이 3개 이상인 WRITER_ID를 도출하고 USER_ID가 도출한 WRITER_ID와 동일한 유저의 정보만 출력하도록 기본 구조를 잡았다. 유저의 CITY, STREET_ADDRESS1,2를 합쳐서 출력하는 것은 CONCAT 메소드를 이용했으며,전화번호 같은 경우는 CONCAT과 동시에 SUBSTRING을 통해 중간 중간에 하이픈(-)을 삽입했다. 코드WITH BOARD AS (     SELECT DISTINCT WRITER_ID     FROM USED_GOODS_BOARD     GROUP BY WRITER_ID     HAVING count(*) > 2 ) SELECT ugu.USER_ID, ugu.NICKNAME,  CONCAT(ugu.CI.. 더보기
[My_SQL] FrontEnd 개발자 찾기 문제  CATEGORY가 Front End 인 CODE값을 찾아서 DEVELOPERS에 조인한다. 이 때  & 연산자를 사용하여 검증한다.SKILL_CODE가 여러 SKILL을 가지고 있다면 중복되어 표시 될 수 있기 때문에 DISTINCT를 사용한다. 코드WITH front AS (     SELECT CODE     FROM SKILLCODES     WHERE CATEGORY = 'Front End' ) SELECT DISTINCT dev.ID, dev.EMAIL, dev.FIRST_NAME, dev.LAST_NAME FROM DEVELOPERS dev JOIN front ON dev.SKILL_CODE & front.CODE ORDER BY 1 ASC; 더보기