목록DB/Programmers SQL (84)
YataNox
문제 https://school.programmers.co.kr/learn/courses/30/lessons/59041 프로그래머스SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프programmers.co.kr COUNT를 사용하여 name별 갯수를 세고 HAVING 절을 사용해 2개 이상인 값만 출력하면 되는 간단한 문제이다.코드SELECT NAME, COUNT(name)FROM ANIMAL_INSGROUP BY NAMEHAVING COUNT(name) > 1ORDER BY 1
문제 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 이전에 아래 글처럼 특정 세대의 대장균을 찾은 적이 있다. 이때 서브쿼리를 재귀처리하여 사용했었는데 문제를 보자마자 일단 재귀로 각 세대를 다 찾아야겠구나 생각이 들었는데 또 다시 코드 노가다를 해야하나 싶었다.그러다가 RECURSIVE라는 재귀용 함수를 찾았다. (효자다 효자)RECURSIVE를 통해 각 대장균의 세대를 다 구해주니 너무 편하게 원하는 테이블을 만들었다.이후 해당 테이블을 셀프 조인하고 세대별로 그룹화 한 뒤 문제를 해결했다. [My_SQL] 특정 세대의 대장균 찾기문제 무식하게 데이터를..
문제 프로그래머스코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.programmers.co.kr 처음엔 WITH절들을 이용해서 각 GRADE에 의해 하나하나 구한 뒤 UNION작업을 통해 합쳐주었지만 코드가 너무 길었고 비효율적이었다. 아래 블로그에서 좀 더 좋은 코드를 발견하여 공유한다. GROUP BY - [언어별 개발자 분류하기] _ LEVEL 4해당 문제는 원래 9주차에 풀었던 문제지만, 풀이 과정에 대한 자세한 설명이 필요해 따로 포스팅한다프로그래머스 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/276036[ 문제 ]S..
문제 처음 봤을 땐 이게 레벨 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..
문제 조인 두 번만 하면 되는 문제이다.우선 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...
문제 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..
문제 우선 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;
문제 조인으로 처리를 해도 되지만 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..