다은하게

[프로그래머스 SQL/DB 스터디 1기 6주차] 후기&TIL 본문

프로그래머스 스쿨/SQLxDB 스터디 1기

[프로그래머스 SQL/DB 스터디 1기 6주차] 후기&TIL

DaaEun 2022. 1. 9. 00:19

6주차 :  2021.12.12 ~ 2021.12.18

전체적인 6주차 스터디 후기 

CH11. CTE와 통계테이블, CH12. 윈도우함수와 그룹함수에 대해 온라인 강의를 시청했다. 이젠 정말 처음 배운 개념들이다. 생소하다. 그만큼 새로운 공부의 기회가 되었기에 너무 좋았다. 또한 내 역량이 한층 더 업그레이드 된거 같아 뿌듯했다.

마지막 주에는 좀 더 열심히 실시간 세션에도 참여하고 싶었으나, 4학년 마지막 기말고사기간이 겹치면서 두루두루 바빴다.

그래서 CH12주차 코테 과제를 못했다. 대신 기말고사 끝나고 전부 마스터(? 아마도) 했다!!

마지막 실시간 세션인지 강사님도, 매니저님도, 다른 학습자분들도 아쉬워했다.

비록 쉽지 않은 스터디였지만 다들 많은 공부가 되었기에 감사하다는 말을 전했다.


1. CTE

🙄 문제
지점(offices.city) 별로 2004년의 월별 결제횟수, 그리고 총결제횟수를 검색하세요.
출력 컬럼은 지점, 1월부터 12월까지의 월별 결제횟수, 총결제횟수 순으로 합니다.
결제횟수가 없으면 0을 출력합니다.
결과는 지점의 오름차순으로 정렬합니다.
마지막 행으로, 1월부터 12월, 그리고 총결제횟수 컬럼 각각의 합계를 출력합니다.
이때 지점에는 '합계'라고 출력하세요
 
⛔ 나의 코드 
SELECT O.city AS 지점, 
COALESCE(SUM(CASE MONTH(paymentDate) WHEN 1 THEN 1 END),0) 1월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 2 THEN 1 END),0) 2월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 3 THEN 1 END),0) 3월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 4 THEN 1 END),0) 4월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 5 THEN 1 END),0) 5월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 6 THEN 1 END),0) 6월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 7 THEN 1 END),0) 7월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 8 THEN 1 END),0) 8월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 9 THEN 1 END),0) 9월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 10 THEN 1 END),0) 10월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 11 THEN 1 END),0) 11월,
COALESCE(SUM(CASE MONTH(P.paymentDate) WHEN 12 THEN 1 END),0) 12월,
COALESCE(COUNT(*),0) 총결제횟수
FROM customers C LEFT JOIN payments P USING (customerId)
	JOIN employees E ON C.salesRepId = E.employeeId
	JOIN offices O USING (officeCode)
WHERE YEAR(paymentDate) = 2004
GROUP BY O.city
ORDER BY 1;
-- 합계의 개념을 제대로 익히지 못해서 완벽한 답 제출 못했다.

 

✅ 피드벡 

With temp AS
(
	SELECT	O.city 지점,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 1 THEN 1 END),0) AS 1월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 2 THEN 1 END),0) AS 2월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 3 THEN 1 END),0) AS 3월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 4 THEN 1 END),0) AS 4월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 5 THEN 1 END),0) AS 5월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 6 THEN 1 END),0) AS 6월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 7 THEN 1 END),0) AS 7월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 8 THEN 1 END),0) AS 8월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 9 THEN 1 END),0) AS 9월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 10 THEN 1 END),0) AS 10월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 11 THEN 1 END),0) AS 11월,
			COALESCE(SUM(CASE MONTH(paymentDate) WHEN 12 THEN 1 END),0) AS 12월,
			COALESCE(COUNT(*),0) 총결재횟수
	FROM	offices O JOIN employees USING (officeCode)
			JOIN customers ON employeeId = salesRepId
			JOIN payments USING (customerId)
	WHERE	YEAR(paymentDate) = 2004
	GROUP 	BY O.city
	ORDER 	BY O.city
)
SELECT	*
FROM	temp
UNION ALL	-- UNION ALL 사용
SELECT	'합계', SUM(1월), SUM(2월), SUM(3월), SUM(4월), SUM(5월), SUM(6월),
		SUM(7월), SUM(8월), SUM(9월), SUM(10월), SUM(11월), SUM(12월), SUM(총결재횟수)
FROM	temp;

2. 그룹함수

🙄 문제
지점(offices.city) 별로, 그리고 각 지점 내에서는 직원 별로 담당 고객수(소계)를 검색하세요.
또한 지점별 고객수(중계), 그리고 전체 고객수(합계)도 함께 검색하세요.
출력 컬럼은 지점, 성명, 고객수 순으로 합니다.
담당 지점과 직원이 없는 고객의 경우, 지점명과 직원명에는 각각 '미정'이라고 나타냅니다.
 
⛔ 나의 코드 
SELECT	COALESCE(O.city, '미정') AS 지점,
		COALESCE(CONCAT(firstName, ' ', lastName), '미정') AS 성명, 
        COUNT(customerId) AS 고객수
FROM	offices O JOIN employees USING (officeCode)
		RIGHT JOIN customers ON employeeId = salesRepId
GROUP 	BY 지점, 성명 WITH ROLLUP;
-- 중계와 합계를 제대로 적용하지 못함.

 

✅ 피드벡 

WITH temp AS
(
		SELECT	COALESCE(O.city, '미정') AS 지점,
				COALESCE(CONCAT(firstName, ' ', lastName), '미정') AS 성명, 
				customerId
		FROM	offices O JOIN employees USING (officeCode)
				RIGHT JOIN customers ON employeeId = salesRepId
)
SELECT	CASE	GROUPING(지점)
			WHEN 1 THEN '모든 지점' 
			ELSE 지점
		END AS 지점,
		CASE	GROUPING(성명)
			WHEN 1 THEN '모든 직원'
			ELSE 성명
		END AS 성명,
		COUNT(customerId) AS 고객수
FROM 	temp
GROUP 	BY 지점, 성명 WITH ROLLUP;

프로그래머스 스쿨 [스터디/1기] 학교 밖에서 듣는 전공필수 SQL/DB Essential 바로가기

 

[스터디/1기] 학교 밖에서 듣는 전공필수 SQL/DB Essentials

🚀 아쉽지만 1기는 마감되었어요. 2기 오픈 알림 신청하고, 최저가에 수강하세요! 최저가 알림 받기 개발자에게 데이터 베이스를 이해하는 능력은 필수! 데이터 베이스의 기본 개념부터 ERD를 읽

programmers.co.kr

 

Comments