Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
Tags
- MYSQL
- Datarian
- leetcode
- 린분석
- python
- 서브쿼리
- 윈도우 함수
- row_number
- 프로그래머스
- 취준
- 데이터리안
- 그로스해킹
- rank
- 순위함수
- 독서
- 신입 데이터분석가
- funnel
- LEFTJOIN
- 윈도우함수
- pandas
- 데이터분석
- SolveSQL
- 퍼널분석
- dense_rank
- Retention
- 누적합
- SQL
- 리텐션
- advent of sql
- regexp
Archives
- Today
- Total
데이터 분석
[Day 12] solvesql | Advent of SQL 2024 | 3년간 들어온 소장품 집계하기💡 본문
3년간 들어온 소장품 집계하기
문제 조건
1. 각 분류에 대해 2014년부터 2016년까지 추가된 소장품 수 집계
2. 분류 컬럼 기준 오름차순 정렬
3. 집계하는 3년간 추가된 특정 분류의 소장품이 없더라도 해당 분류와 집계 내역을 결과 테이블에서 누락시키지 말 것 ⭐
Solution
✅SQLite
WITH T AS (
SELECT classification,
substr(acquisition_date, 1, 4) as acquisition_year
FROM artworks
-- WHERE acquisition_date BETWEEN '2014-01-01' AND '2016-12-31'
)
SELECT classification,
sum(case when acquisition_year = '2014' then 1 else 0 end) as '2014',
sum(case when acquisition_year = '2015' then 1 else 0 end) as '2015',
sum(case when acquisition_year = '2016' then 1 else 0 end) as '2016'
FROM T
GROUP BY classification
ORDER BY classification
✔️WITH 절에서 acquisition_date의 연도 부분만 추출한다.
✔️메인 쿼리에서는 SUM과 CASE문을 사용해 해당 연도에 대해 조건에 맞는 데이터를 집계한다.
✅MySQL
SELECT classification
, COUNT(CASE WHEN acquisition_date LIKE '2014%' THEN artwork_id END) AS '2014'
, COUNT(CASE WHEN acquisition_date LIKE '2015%' THEN artwork_id END) AS '2015'
, COUNT(CASE WHEN acquisition_date LIKE '2016%' THEN artwork_id END) AS '2016'
FROM artworks
GROUP BY classification
ORDER BY classification
/*
SELECT classification
, COUNT(CASE WHEN YEAR(acquisition_date) = 2014 THEN artwork_id END) AS '2014'
, COUNT(CASE WHEN YEAR(acquisition_date) = 2015 THEN artwork_id END) AS '2015'
, COUNT(CASE WHEN YEAR(acquisition_date) = 2016 THEN artwork_id END) AS '2016'
FROM artworks
GROUP BY classification
SELECT classification
, SUM(CASE WHEN acquisition_date BETWEEN '2014-01-01' AND '2014-12-31' THEN 1 ELSE 0 END) AS '2014' -- 👉숫자를 컬럼으로 할 때는 ''
, SUM(CASE WHEN acquisition_date BETWEEN '2015-01-01' AND '2015-12-31' THEN 1 ELSE 0 END) AS '2015'
, SUM(CASE WHEN acquisition_date BETWEEN '2016-01-01' AND '2016-12-31' THEN 1 ELSE 0 END) AS '2016'
FROM artworks
GROUP BY classification
*/
피드백
이 문제는 3번째 조건을 놓쳐서는 안 된다.
3년간 추가된 특정 분류의 소장품이 없더라도 포함시켜야 하기 때문에, WITH 절에서 2014~2016년의 데이터를 필터링하는 조건을 제외한다.
✔️ 0210 0820 복습
'SQL > solvesql' 카테고리의 다른 글
| [Day 14] solvesql | Advent of SQL 2024 | 전력 소비량 이동 평균 구하기💡 (2) | 2024.12.14 |
|---|---|
| [Day 13] solvesql | Advent of SQL 2024 | 게임 개발사의 주력 플랫폼 찾기⭐ (2) | 2024.12.13 |
| [Day 11] solvesql | Advent of SQL 2024 | 서울숲 요일별 대기오염도 계산💡 (1) | 2024.12.11 |
| [Day 10] solvesql | Advent of SQL 2024 | 최대값을 가진 행 찾기 (0) | 2024.12.10 |
| [Day 9] solvesql | Advent of SQL 2024 | 게임 평점 예측하기 1💡 (0) | 2024.12.10 |