1주차 이틀차. 팀프로젝트는 팀원분들이 너무 방향을 잘 잡아주셔서 순조롭다.
다만 오늘은 컨디션이 좋지 않아서 하루 종일 힘들었다. 환절기 독감은 독해서 독감인가...
팀 프로젝트
* 어제 정의한 문제에 대해 각자 생각한 가설대로 분석을 시행했다.
* 나는 카테고리-상품에 따른 문제로 profit이 낮은 것이라 추측했는데, 만족스러울만큼 분석은 하지 못했다.
일부는 카테고리에 따라 낮게 나타나고, 일부는 또 아니고... SQL로는 엑셀처럼 원하는 결과를 바로 나타내기가 아직은 어렵다.
* DBeaver에서 테이블의 data type과 형식 변환하는 법을 몰라서 오래 걸렸지만 해결했다. 맞는 방법인지는 의문이다.
* UPDATE 와 SET 구문 활용
* 테이블의 Properties에서 컬럼명, data type 변경 가능
학습 내용
* Table UPDATE
컬럼 중 주문일에 해당하는 Order Date가 dd-mm-yy 형식의 str 데이터로 저장되어 있어서 변환을 해야했다.
```
SQL
UPDATE us -- 테이블명
SET `Order Date` = STR_TO_DATE(`Order Date`, '%d-%m-%y')
```
* 피벗테이블 형태로 가공하기
두 개 이상의 조건으로 정렬한 표가 필요할 때 - Sales 수치를 카테고리별로도 집계하지만 월별로도 집계해서 보고 싶었다.
하지만 숫자가 정리되어있지 않아서 결과 보기가 좋지 않았다. GPT한테 물어봤지만 일일이 ROUND 함수를 붙이는 방법만 알려줬다.
시간이 남으면 멘토님께 여쭤봐서 해결해야겠다.
```
SQL
SELECT Category, Sub_Category
,sum(CASE WHEN MONTH(Order_Date)=1 THEN Sales ELSE NULL END) '1월'
,sum(CASE WHEN MONTH(Order_Date)=2 THEN Sales ELSE NULL END) '2월'
,sum(CASE WHEN MONTH(Order_Date)=3 THEN Sales ELSE NULL END) '3월'
,sum(CASE WHEN MONTH(Order_Date)=4 THEN Sales ELSE NULL END) '4월'
,sum(CASE WHEN MONTH(Order_Date)=5 THEN Sales ELSE NULL END) '5월'
,sum(CASE WHEN MONTH(Order_Date)=6 THEN Sales ELSE NULL END) '6월'
,sum(CASE WHEN MONTH(Order_Date)=7 THEN Sales ELSE NULL END) '7월'
,sum(CASE WHEN MONTH(Order_Date)=8 THEN Sales ELSE NULL END) '8월'
,sum(CASE WHEN MONTH(Order_Date)=9 THEN Sales ELSE NULL END) '9월'
,sum(CASE WHEN MONTH(Order_Date)=10 THEN Sales ELSE NULL END) '10월'
,sum(CASE WHEN MONTH(Order_Date)=11 THEN Sales ELSE NULL END) '11월'
,sum(CASE WHEN MONTH(Order_Date)=12 THEN Sales ELSE NULL END) '12월'
FROM us
GROUP BY 1, 2
ORDER BY 1, 2 DESC
```
* 순위 부여하기
윈도우 함수 `RANK()` 를 사용한다. GROUP BY 절 사용해서 집계하고 싶었는데 계속 오류가 발생.
내일 해결해서 조금 더 분석하는 데 활용하고 싶다.
```
SQL
/*순위 부여하기*/
SELECT Category
,Sub_Category
,Sales
,RANK() OVER (PARTITION BY Sub_Category ORDER BY Sales Desc) AS ranking
FROM us
```
* JOIN 중복 사용
* 프로그래머스 SQL 문제 : 취소되지 않은 진료 예약건 구하기
* JOIN을 여러번 쓸 수 있다니 새로웠다.
```
SQL
SELECT a.APNT_NO, p.PT_NAME, a.PT_NO, a.MCDP_CD, d.DR_NAME, a.APNT_YMD
FROM APPOINTMENT a
JOIN DOCTOR d
ON a.MDDR_ID=d.DR_ID
JOIN PATIENT p
ON a.PT_NO=p.PT_NO
WHERE (DATE_FORMAT(a.APNT_YMD,"%Y-%m-%d") = '2022-04-13')
AND (a.APNT_CNCL_YN = 'N')
ORDER BY 6 asc
```
고찰 & 기타
* 다른 팀원분들이 분석적인 면에서 좋은 결론을 내고 계셔서 늦는 내가 좀 고민되긴 하지만, 천천히 쿼리 연습하면서 따라가야겠다.
* 조금 오랜만에 SQL과 파이썬 문제를 풀었는데 실수가 좀 있었다. 내일은 문제를 꼼꼼히 읽어야지.
* 오전에 튜터님, 매니저님이 SQL 쿼리문 작성할 때 팁을 주셨다. 그래서 오전에 작성한 쿼리(코테)랑 저녁에 작성한 쿼리가 다르고, 보다 정돈된 양식으로 작성할 수 있었다. 적절한 팁이었다.
* 본캠프 남은 기간 동안 절대 아프지 않도록 컨디션 관리 잘 해야겠다... 오늘 너무 힘들었다.
'내일배움캠프_데이터분석_2기 > TIL' 카테고리의 다른 글
[TIL] camp_day4_240418 (0) | 2024.04.18 |
---|---|
[TIL] camp_day3_240417 (0) | 2024.04.17 |
[TIL] camp_day1_240415 (0) | 2024.04.15 |
[TIL] precamp_day8_240327 (0) | 2024.03.27 |
[TIL] precamp_day7 (0) | 2024.03.26 |