계속해서 SQL문제를 풀이를 하며 새로 깨닫게 되거나 틀려서 문제가 되었던 점을 기록해보겠습니다.
3개의 테이블을 합치는 방법으로 JOIN 밑으로 다시 조인은 넣어주어서 합쳐줄 수 있으며 각 테이블의
공통된 내용을 찾아서 맞추어 주어야 한다,
-- 코드를 입력하세요SELECT A.APNT_NO, B.PT_NAME, A.PT_NO, A.MCDP_CD, C.DR_NAME, A.APNT_YMD
FROM APPOINTMENT A
INNERJOIN PATIENT B ON A.PT_NO = B.PT_NO
INNERJOIN DOCTOR C ON A.MDDR_ID = C.DR_ID
WHERE C.MCDP_CD = 'CS'AND APNT_YMD LIKE'2022-04-13%'AND A.APNT_CNCL_YN = 'N'ORDERBY APNT_YMD
특정일 기준 상태 파악하기
2022-10-16 일 기점으로 대여중인지 아닌지를 판단하는 방법은 쉬웠다 CASE문을 사용하여 기간에 맞추어 조건을 걸어주면 되는 것이었지만
처음에는 RANK 함수로 최근 대여상황을 판단하여하면 될 줄 알았으나
문제는 현시점의 대여 가능 유무가 아닌 2022-10-16 시점에 대여가 가능했는지를 따지는 것이기 때문에 그 시점 이후에 더욱 쌓여 버린 데이터에 의해서 설정하는 것이 매우 난관이었다
그렇기에 CASE문으로 일정 기간에 대여중인지 아닌지를 판단을 하고 모든 각차종 중에서 대기 중이 하나라도 있는 경우에는 대여중이라고 표시를 해야 하며 하나도 없을 경우에는 대여가능이라는 표시를 해야 한다.
다행히도 경우의 수가 2개밖에 없었지라 MAX 값을 이용해서 값들 중에 가장 큰 값을 가져오면 되는 방식으로 사용을 하면 되었다.
-- 코드를 입력하세요SELECT CAR_ID,
MAX (CASEWHEN START_DATE <='2022-10-16'AND END_DATE >='2022-10-16'THEN'대여중'ELSE'대여 가능'END) AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUPBY1ORDERBY1DESC
MAX를 사용하는 것이 아니라 내용 중 대여중이라는 글자를 인식을 해서 판단을 해주는 방법을 찾으면
여러 가지 조건에서도 다양하게 이용을 할 수 있을 것 같다.
-- 코드를 입력하세요SELECT A.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE), 2) SCORE
FROM REST_INFO A LEFTJOIN REST_REVIEW B ON A.REST_ID = B.REST_ID
WHERE ADDRESS LIKE'서울%'AND REVIEW_SCORE ISNOTNULLGROUPBY2ORDERBY SCORE DESC, FAVORITES DESC
ROUND 명령어는 앞에 넣을 숫자를 넣고 , 를 찍은 뒤 뒤에 몇 번째까지 소수점을 남길 것인지 표기를 해준 면 된다.
DATE 차이 계산법
SELECT CAR_ID, AVERAGE_DURATION
FROM
(
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1), 1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUPBY1ORDERBY2DESC, 1DESC
)A
WHERE AVERAGE_DURATION >=7
위에서 보다시피
DATEDIFF(END_DATE, START_DATE)+1
마지막에 +1을 붙여주는데 날짜계산을 예를 들어
1일에서 10일까지를 생각하면 1을 포함해야 하기에 총 10일로 계산을 하지만
공식으로 계산이 되면 10-1이 되어서 9일로 계산이 된다.
그렇기에 +1을 넣어주어 우리가 원하는 값을 얻을 수 있다.
HAVING 이용하여 필터링하기
일반적인 칼럼을 필터링하기 위해서는 WHERE BY 절을 이용하여 내가 원하는 값만 가져와서 사용할 수 있었지만
SUM, AVG, COUNT와 같이 합쳐서 그룹을 만들어준 값을 기준으로 필터링을 하고 싶을 때에는 HAVING을 사용하여
내가 원하는 값에 사용 할 수 있다.
-- 코드를 입력하세요SELECT ID, NAME, HOST_ID
FROM PLACES
WHERE HOST_ID IN ( SELECT HOST_ID
FROM PLACES
GROUPBY1HAVINGCOUNT(1) >=2
)
ORDERBY1
2개 이상 주문한 사람의 주문내역을 본다 같이 어떤 기준이 되는 값을 가지는 사람의 모든 데이터 값을 보기 위해서는
그룹을 시켜 필터링을 하고 다시 그룹을 풀어주어야 하지만 한번 그룹이 되어버리면 풀어버릴 수 없기 때문에
서브쿼리를 만들어주고 거기에서 내가 원하는 그룹만 HAVING으로 찾아내준다음
WHERE BY로 각 칼럼을 찾아내어 주면 된다.
다른 칼럼에서 조건 맞추어서 찾는 법
그림처럼 칼럼이 서로 다른 곳에서 두개 이상의 조건을 맞추어야 할 때에도 HAVING을 사용 할 수 있다.
-- 코드를 입력하세요SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUPBY1HAVINGCOUNT(DISTINCT NAME) =2ORDERBY1
UNION을 이용한 다른 테이블 속 컬럼 합치기
그림과 같이 테이블 명은 다르지만 동일한 컬럼을 사용할 때 같은 컬럼내용을 합쳐주기 위해서 UNION을 사용하여 합쳐줄수 있다.
-- 코드를 입력하세요SELECT FLAVOR
FROM
(
SELECT*FROM JULY
UNIONSELECT*FROM FIRST_HALF
)A
GROUPBY1ORDERBYSUM(TOTAL_ORDER) DESC
LIMIT 3
내용이 합쳐졌기 때문에 합을 계산하기에 편리해진다.
-- 코드를 입력하세요WITH USED AS (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN'2022-08-01'AND'2022-10-31'GROUPBY CAR_ID
HAVINGCOUNT(1) >=5
)
SELECTMONTH(START_DATE) 'MONTH', CAR_ID, COUNT(1) 'RECORDS'FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN'2022-08-01'AND'2022-10-31'AND CAR_ID IN (SELECT CAR_ID FROM USED)
GROUPBY1, 2ORDERBY1, 2DESC
WITH을 이용하여 앞에 먼저 선언을 해서 서브 쿼리를 사용할 때 적은 글자로 사용할 수 있으며
다른 곳에서도 쉽게 사용이 가능하다
GIT 강의
기본적인 리눅스 명령어를 배워야 한다. (자동완성 적용)
pwd : 현재 작업 중인 파일 경로 표시
ls (list) : 폴더 및 파일을 표시해 준다
ls -a (list all) : 숨긴 폴더까지 모두 표시
cd 폴더명 (change diretory) : 폴더 선택해서 이동
cd.. : 상위 경로 가기 cd../../하면 두번도 가능
cd . : 현재 경로
mkdir(Make Diretory) 폴더명 : 현재 경로에서 빈 폴더를 만들어
ll : 파일 속성 보기
touch 파일명 : 빈 파일 생성 git : 코드 변경점을 기록한다. 버전 관리 도구
git hub : 백업 협업을 위한 도구
git init : 개발 프로젝트를 시작 시 한 번만 하면 ok
해당폴더 확인 필수
git status : 현재 작업 중인 상태를 표시
빨간 글씨 = 저장이 되어있지 않음
녹색글씨 = 저장준비 스테이지위에 올라감
흰색 글씨= 저장됨
git add & commit : 코드를 저장
git add 파일명
git commit -m "메시지 작성" :메시지 달아주기
git add. : 현재 경로에 있는 모든 파일
git log : commit 저장내역 확인
git checkout (ID) : 과거 커밋 기록으로 넘어갈 수 있다.
git checkout master : 현재 작업 중인 상태로 복귀
github 백업하기
git remote add origin https://github.com/billyhyunjun/github-test.gitgit branch -M main
gitpush -u origin main
계속해서 SQL문제를 풀이를 하며 새로 깨닫게 되거나 틀려서 문제가 되었던 점을 기록해보겠습니다.
3개의 테이블을 합치는 방법으로 JOIN 밑으로 다시 조인은 넣어주어서 합쳐줄 수 있으며 각 테이블의
공통된 내용을 찾아서 맞추어 주어야 한다,
-- 코드를 입력하세요SELECT A.APNT_NO, B.PT_NAME, A.PT_NO, A.MCDP_CD, C.DR_NAME, A.APNT_YMD
FROM APPOINTMENT A
INNERJOIN PATIENT B ON A.PT_NO = B.PT_NO
INNERJOIN DOCTOR C ON A.MDDR_ID = C.DR_ID
WHERE C.MCDP_CD = 'CS'AND APNT_YMD LIKE'2022-04-13%'AND A.APNT_CNCL_YN = 'N'ORDERBY APNT_YMD
특정일 기준 상태 파악하기
2022-10-16 일 기점으로 대여중인지 아닌지를 판단하는 방법은 쉬웠다 CASE문을 사용하여 기간에 맞추어 조건을 걸어주면 되는 것이었지만
처음에는 RANK 함수로 최근 대여상황을 판단하여하면 될 줄 알았으나
문제는 현시점의 대여 가능 유무가 아닌 2022-10-16 시점에 대여가 가능했는지를 따지는 것이기 때문에 그 시점 이후에 더욱 쌓여 버린 데이터에 의해서 설정하는 것이 매우 난관이었다
그렇기에 CASE문으로 일정 기간에 대여중인지 아닌지를 판단을 하고 모든 각차종 중에서 대기 중이 하나라도 있는 경우에는 대여중이라고 표시를 해야 하며 하나도 없을 경우에는 대여가능이라는 표시를 해야 한다.
다행히도 경우의 수가 2개밖에 없었지라 MAX 값을 이용해서 값들 중에 가장 큰 값을 가져오면 되는 방식으로 사용을 하면 되었다.
-- 코드를 입력하세요SELECT CAR_ID,
MAX (CASEWHEN START_DATE <='2022-10-16'AND END_DATE >='2022-10-16'THEN'대여중'ELSE'대여 가능'END) AVAILABILITY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUPBY1ORDERBY1DESC
MAX를 사용하는 것이 아니라 내용 중 대여중이라는 글자를 인식을 해서 판단을 해주는 방법을 찾으면
여러 가지 조건에서도 다양하게 이용을 할 수 있을 것 같다.
-- 코드를 입력하세요SELECT A.REST_ID, REST_NAME, FOOD_TYPE, FAVORITES, ADDRESS, ROUND(AVG(REVIEW_SCORE), 2) SCORE
FROM REST_INFO A LEFTJOIN REST_REVIEW B ON A.REST_ID = B.REST_ID
WHERE ADDRESS LIKE'서울%'AND REVIEW_SCORE ISNOTNULLGROUPBY2ORDERBY SCORE DESC, FAVORITES DESC
ROUND 명령어는 앞에 넣을 숫자를 넣고 , 를 찍은 뒤 뒤에 몇 번째까지 소수점을 남길 것인지 표기를 해준 면 된다.
DATE 차이 계산법
SELECT CAR_ID, AVERAGE_DURATION
FROM
(
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1), 1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUPBY1ORDERBY2DESC, 1DESC
)A
WHERE AVERAGE_DURATION >=7
위에서 보다시피
DATEDIFF(END_DATE, START_DATE)+1
마지막에 +1을 붙여주는데 날짜계산을 예를 들어
1일에서 10일까지를 생각하면 1을 포함해야 하기에 총 10일로 계산을 하지만
공식으로 계산이 되면 10-1이 되어서 9일로 계산이 된다.
그렇기에 +1을 넣어주어 우리가 원하는 값을 얻을 수 있다.
HAVING 이용하여 필터링하기
일반적인 칼럼을 필터링하기 위해서는 WHERE BY 절을 이용하여 내가 원하는 값만 가져와서 사용할 수 있었지만
SUM, AVG, COUNT와 같이 합쳐서 그룹을 만들어준 값을 기준으로 필터링을 하고 싶을 때에는 HAVING을 사용하여
내가 원하는 값에 사용 할 수 있다.
-- 코드를 입력하세요SELECT ID, NAME, HOST_ID
FROM PLACES
WHERE HOST_ID IN ( SELECT HOST_ID
FROM PLACES
GROUPBY1HAVINGCOUNT(1) >=2
)
ORDERBY1
2개 이상 주문한 사람의 주문내역을 본다 같이 어떤 기준이 되는 값을 가지는 사람의 모든 데이터 값을 보기 위해서는
그룹을 시켜 필터링을 하고 다시 그룹을 풀어주어야 하지만 한번 그룹이 되어버리면 풀어버릴 수 없기 때문에
서브쿼리를 만들어주고 거기에서 내가 원하는 그룹만 HAVING으로 찾아내준다음
WHERE BY로 각 칼럼을 찾아내어 주면 된다.
다른 칼럼에서 조건 맞추어서 찾는 법
그림처럼 칼럼이 서로 다른 곳에서 두개 이상의 조건을 맞추어야 할 때에도 HAVING을 사용 할 수 있다.
-- 코드를 입력하세요SELECT CART_ID
FROM CART_PRODUCTS
WHERE NAME IN ('Milk', 'Yogurt')
GROUPBY1HAVINGCOUNT(DISTINCT NAME) =2ORDERBY1
UNION을 이용한 다른 테이블 속 컬럼 합치기
그림과 같이 테이블 명은 다르지만 동일한 컬럼을 사용할 때 같은 컬럼내용을 합쳐주기 위해서 UNION을 사용하여 합쳐줄수 있다.
-- 코드를 입력하세요SELECT FLAVOR
FROM
(
SELECT*FROM JULY
UNIONSELECT*FROM FIRST_HALF
)A
GROUPBY1ORDERBYSUM(TOTAL_ORDER) DESC
LIMIT 3
내용이 합쳐졌기 때문에 합을 계산하기에 편리해진다.
-- 코드를 입력하세요WITH USED AS (
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN'2022-08-01'AND'2022-10-31'GROUPBY CAR_ID
HAVINGCOUNT(1) >=5
)
SELECTMONTH(START_DATE) 'MONTH', CAR_ID, COUNT(1) 'RECORDS'FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN'2022-08-01'AND'2022-10-31'AND CAR_ID IN (SELECT CAR_ID FROM USED)
GROUPBY1, 2ORDERBY1, 2DESC
WITH을 이용하여 앞에 먼저 선언을 해서 서브 쿼리를 사용할 때 적은 글자로 사용할 수 있으며
다른 곳에서도 쉽게 사용이 가능하다
GIT 강의
기본적인 리눅스 명령어를 배워야 한다. (자동완성 적용)
pwd : 현재 작업 중인 파일 경로 표시
ls (list) : 폴더 및 파일을 표시해 준다
ls -a (list all) : 숨긴 폴더까지 모두 표시
cd 폴더명 (change diretory) : 폴더 선택해서 이동
cd.. : 상위 경로 가기 cd../../하면 두번도 가능
cd . : 현재 경로
mkdir(Make Diretory) 폴더명 : 현재 경로에서 빈 폴더를 만들어
ll : 파일 속성 보기
touch 파일명 : 빈 파일 생성 git : 코드 변경점을 기록한다. 버전 관리 도구
git hub : 백업 협업을 위한 도구
git init : 개발 프로젝트를 시작 시 한 번만 하면 ok
해당폴더 확인 필수
git status : 현재 작업 중인 상태를 표시
빨간 글씨 = 저장이 되어있지 않음
녹색글씨 = 저장준비 스테이지위에 올라감
흰색 글씨= 저장됨
git add & commit : 코드를 저장
git add 파일명
git commit -m "메시지 작성" :메시지 달아주기
git add. : 현재 경로에 있는 모든 파일
git log : commit 저장내역 확인
git checkout (ID) : 과거 커밋 기록으로 넘어갈 수 있다.
git checkout master : 현재 작업 중인 상태로 복귀
github 백업하기
git remote add origin https://github.com/billyhyunjun/github-test.gitgit branch -M main
gitpush -u origin main