다잇소


[IT/트랜드] 김태공과 함께 하는 알아두면 편리한 SQL TIP

2016.07.18
sql

프로젝트 개발이나 운영시 많이 사용하는 SQL 유형이라고 생각하는데…숙지해 두면 두고두고 사용할 수 있을 겁니다.
퀴즈를 풀면서 개인이 느끼기에 난이도를 적어주셔요.
1(쉬움)-10(어려움)
<문제>

예전에 **캐피탈에서 프로젝트를 개발할때 요구사항입니다.

공사업체에 공사대금을 지급후에 그 내역이 축적된 테이블이 있습니다.

공사업체별로 최초 대금지급 일자/금액과 마지막 대금지급 일자/금액을 추출하는 요구사항입니다.

간단하죠? ^^

 

 

아래 조건으로 <추출결과>가 출력되는 SQL을 작성하시오.
물론 테이블은 한번만 ACCESS 해야죠.
조건1. <기본정보>화면의 색깔 표시된 업체별 최초대금지급일자, 지급금액, 마지막대금지급일자, 지급금액 추출
조건2. 실제 테이블에는 많은 데이타가 존재하나 테이블 생성이 어려워 아래 WITH절은 일부만 표시
아래 SQL을 사용하여 WITH로 처리.

 

WITH 테_지급내역  AS
(SELECT ‘삼성’ 업체명, ‘20110101’ 지급일자, 30000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110201’ 지급일자, 50000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110301’ 지급일자, 20000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110205’ 지급일자, 66000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110305’ 지급일자, 44000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110405’ 지급일자, 55000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110320’ 지급일자, 11000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110420’ 지급일자, 22000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110520’ 지급일자, 33000 지급금액
FROM DUAL
)
SELECT 업체명, 지급일자, 지급금액
FROM 테_지급내역;

 

 

<기본정보>

기본정보

 

<추출결과>

추출결과

 

 

 

 

 

 
답안)

— 고전함수 사용시
WITH 테_지급내역  AS
(SELECT ‘삼성’ 업체명, ‘20110101’ 지급일자, 30000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110201’ 지급일자, 50000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110301’ 지급일자, 20000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110205’ 지급일자, 66000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110305’ 지급일자, 44000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110405’ 지급일자, 55000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110320’ 지급일자, 11000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110420’ 지급일자, 22000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110520’ 지급일자, 33000 지급금액
FROM DUAL
)
SELECT  업체명,
SUBSTR(CHK_MIN,1,8) 지급일자_MIN,
TO_NUMBER(SUBSTR(CHK_MIN,9)) 지급금액,
SUBSTR(CHK_MAX,1,8) 지급일자_MAX,
TO_NUMBER(SUBSTR(CHK_MAX,9)) 지급금액
FROM (
SELECT 업체명,
MIN(지급일자||지급금액) CHK_MIN,
MAX(지급일자||지급금액) CHK_MAX
FROM   테_지급내역
GROUP BY    업체명
)
— KEEP 함수 사용시
WITH 테_지급내역  AS
(SELECT ‘삼성’ 업체명, ‘20110101’ 지급일자, 30000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110201’ 지급일자, 50000 지급금액
FROM DUAL
UNION ALL
SELECT ‘삼성’ 업체명, ‘20110301’ 지급일자, 20000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110205’ 지급일자, 66000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110305’ 지급일자, 44000 지급금액
FROM DUAL
UNION ALL
SELECT ‘엘지’ 업체명, ‘20110405’ 지급일자, 55000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110320’ 지급일자, 11000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110420’ 지급일자, 22000 지급금액
FROM DUAL
UNION ALL
SELECT ‘구글’ 업체명, ‘20110520’ 지급일자, 33000 지급금액
FROM DUAL
)
SELECT  업체명,
MIN(지급일자) 지급일자_MIN,
MIN(지급금액) KEEP(DENSE_RANK FIRST ORDER BY 지급일자 )  지급금액,
MAX(지급일자) 지급일자_MAX,
MAX(지급금액) KEEP(DENSE_RANK LAST ORDER BY 지급일자 )  지급금액
FROM  테_지급내역
GROUP BY    업체명

 .

김 석기의 프로필 사진
| Wise리더
관심분야 데이타베이스 Sql튜닝

TAG >
http://daitso.kds.co.kr/49909/ 주소복사
카테고리 레이어 닫기