220930 데이터리안 수업 SELECT문에 들어가는 조건 CASE WHEN ~ THEN~ END / 피봇 테이블/ 문제 실습 (인프런중급SQL강의, 집계함수, SUM(), AVG(), DISTINCT, GROUP BY, HAVING, 해커스랭크, 조건문, 리트코드 등)
1교시
1. 인프런 중급 SQL 강의 ~조건문까지
1.1 집계 함수
SELECT COUNT(*)
FROM 테이블
테이블에 있는 행들, 데이터 레코드의 갯수를 세준다.
- Null 값이 없으면 COUNT(칼럼)으로 특정 칼럼 검색해도 전체 레코드 갯수랑 똑같이 나온다.
- SELECT COUNT(DISTINCT 칼럼) : 칼럼의 중복된 값 제외하고 갯수 세준다.
- SELECT DISTINCT 칼럼
- SUM(), AVG()
- Null 값이 있을 때, 없다고 생각하고 4로 나눌 것이냐, 전체 자료수 COUNT(*)로 나눌 것이냐
1.2 GROUP BY, HAVING
SELECT 칼럼1, 칼럼2, AVG(칼럼3)
FROM 테이블
GROUP BY 칼럼1, 칼럼2
- 그룹바이에 들어간 항목은 SELECT에 꼭 들어가야 한다.
- 항목 확인할 때는 /* */ 활용해서 찾자
- 한 줄 주석 처리는 --
- ORDER BY는 그룹바이 뒤에
- HAVING은 그룹바이 뒤에: SQL은 순서대로 실행하기 때문에 WHERE을 쓰면 원하는 결과가 안나온다.
1.3 해커스랭크 문제
인터프리터 MySQL로 바꾸는거 잊지 말자!!
- Revising Aggregations - Averages
- Revising Aggregations - The Sum Function
- Average Population : CEIL()올림, FLOOR()내림- rounded down이 문제에 있을 때, ROUND() 반올림
- Population Density Difference
- Weather Observation Station 4
- Top Earners
- salary*months = earnings- 각 earning 별로 몇 명이 그만큼 벌었는지 계산 - 그룹바이
- earning 중에 가장 큰 값을 가져온다. - 내림차순, LIMIT
SELECT salary months AS earnings
, COUNT()
FROM employee
GROUP BY earnings
ORDER BY earnings DESC
LIMIT 1
1.4 조건문
SELECT CASE
WHEN 칼럼1=1 AND 칼럼2=1 THEN '첫번째케이스'
WHEN 칼럼1=2 THEN '두번째케이스'
ELSE '기타'
END AS '케이스이름', *
FROM 테이블
1.5 해커스 랭크 문제
- Type of Triangle
WHEN A=B OR A=C OR B=C 하면 정삼각형도 이등변삼각형 조건에 포함된다.
하지만 정삼각형은 위에서 정했기 때문에 아래로 내려오지 않는다.
- WHEN A=B AND B=C THEN
- 20 20 40이 이등변삼각형에 포함안되게 하기 위해 삼각형이 아닌 조건을 먼저 넣는다.
SELECT CASE
WHEN A = B AND B = C THEN 'Equilateral'
WHEN A + B <=C OR A+C <= B OR B+C <= A THEN 'Not A Triangle'
WHEN A=B OR A=C OR B=C THEN 'Isosceles'
ELSE 'Scalene'
END
FROM Triangles - A=B=C 와 같은 연산은 지원하지 않는다. SQL에서
1.6 테이블 피봇 문제 Leetcode
- 1179번 Reformat Department Table
SELECT id
, SUM(CASE WHEN month = 'Jan' THEN revenue ELSE NULL END) AS Jan_Revenue
, SUM(CASE WHEN month = 'Feb' THEN revenue ELSE NULL END) AS Feb_Revenue
, SUM(CASE WHEN month = 'Mar' THEN revenue ELSE NULL END) AS Mar_Revenue
, SUM(CASE WHEN month = 'Apr' THEN revenue ELSE NULL END) AS Apr_Revenue
, SUM(CASE WHEN month = 'May' THEN revenue ELSE NULL END) AS May_Revenue
, SUM(CASE WHEN month = 'Jun' THEN revenue ELSE NULL END) AS Jun_Revenue
, SUM(CASE WHEN month = 'Jul' THEN revenue ELSE NULL END) AS Jul_Revenue
, SUM(CASE WHEN month = 'Aug' THEN revenue ELSE NULL END) AS Aug_Revenue
, SUM(CASE WHEN month = 'Sep' THEN revenue ELSE NULL END) AS Sep_Revenue
, SUM(CASE WHEN month = 'Oct' THEN revenue ELSE NULL END) AS Oct_Revenue
, SUM(CASE WHEN month = 'Nov' THEN revenue ELSE NULL END) AS Nov_Revenue
, SUM(CASE WHEN month = 'Dec' THEN revenue ELSE NULL END) AS Dec_Revenue
FROM Department
GROUP BY id
2교시
RFM Segmentation. CRM 마케팅 할 때 많이 사용된다.
- CASE WHEN 날짜>='YYYY-MM-DD' THEN 1 ELSE 0 END
- IF(주문수>=숫자, 맞으면 1, 틀리면 0) : 조건 만족하면 1, 아니라면 0 반환하여라
- SELECT CASE
~ AS 새이름1AS 새이름2
IF
COUNT(칼럼1) AS 새이름3
FROM 테이블
GROUP BY 새이름1, 새이름2 로 해도 된다. - 엑셀에서 삽입-피봇테이블 : 만들고 싶은 데이터 영역 지정, 만들기 하면 뼈대가 완성됨.
- 엑셀에서 행과 열에 원하는 정보를 끌어서 옮겨도 되고, 추가해도 된다.
3교시 랜덤 문제 풀기
- CASE WHEN 조건 THEN 칼럼 END (ELSE NULL) AS 새이름
괄호 부분은 굳이 필요없는 조건 - 제일 돈 많이 낸 사람 : 총 금액으로 ORDER BY DESC해서 LIMIT 1
- WHERE 조건이 여러 개 일 때 : WHERE A AND B AND(C OR D) 도 가능하다는 것을 잊지 말자
- WHERE에 날짜 조건 있을 때 : BETWEEN 날짜 AND 날짜
- ROUND(AVG(칼럼), 2- 소수점둘째자리)
- 홀수 : WHERE 칼럼 % 2 = 1 :
/ 슬래시가 아니라 % 기호인 것 기억하자 - UPPER(LEFT(칼럼, 추출할 자릿수))
- WHERE -> GROUP BY -> HAVING : 그룹바이-해빙에 집착하지 말고, 그룹 바이 전 WHERE로 먼저 조건을 넣을 수 있다면 그게 깔끔할 수 있다.
댓글