본문 바로가기

TIL

[240123] SQL: 코드카타 111~112 & 파이썬: 코드카타 22

[SQL 코드카타]

1907. Count Salary Categories

https://leetcode.com/problems/count-salary-categories

 

1) 어떤 문제가 있었나

급여 구간을 나눠서 각 구간별 숫자를 구하는 것인데, 0인 구간 값 도출이 어려웠음

 

2) 내가 시도해본 건 무엇인가

accounts_count 부분에 *, ifnull 등을 시도해보았으나 0 값은 안 나옴 

#오답 #Average Salary 0 값이 안 나옴
select case when income < 20000 then "Low Salary"
            when income between 20000 and 50000 then "Average Salary"
            when income > 50000 then "High Salary"
            end category, 
        count(account_id) accounts_count     
  from Accounts
  group by category

 

3) 어떻게 해결했나

다른 사람 풀이를 통해 3개 카테고리에 대해 union을 진행한 것을 확인 후 적용하여 정답 처리 

select "Low Salary" category, count(*) accounts_count 
 from Accounts
where income < 20000
union 
select "Average Salary" category, count(*) accounts_count 
 from Accounts
where income between 20000 and 50000
union 
select "High Salary" category, count(*) accounts_count 
 from Accounts
where income > 50000;


4) 무엇을 새롭게 알았나

- PIVOT 함수 적용과 UPPIVOT 함수를 활용한 행/열 전환

[PIVOT]
SELECT *
  FROM ( 피벗할 쿼리문 ) AS result
 PIVOT ( 그룹합수(집계할 컬럼)* FOR 피벗대상컬럼(카테고리) IN ([피벗컬럼값] ... ) AS pivot_result
* SUM(), COUNT(), AVG() 등 사용 가능

[UNPIVOT]
SELECT *
  FROM ( 대상테이블 or 서브쿼리 ) AS tab
 UNPIVOT ( 집계값 칼럼명* FOR UNPIVOT대상칼럼명* IN ([UNPIVOT할칼럼명] ... ) AS unpvt
* 집계값 및 UNPIVOT 대상 칼럼명은 임의로 새 명칭을 부여 

 

* 상기 문제 예시 (문제 풀이 페이지에서는 UNPIVOT 부분에 오류 발생해 추후 다른 데이터로 pivot 함수 TEST 필요)  

with category_table as 
    (select sum(case when income < 20000 then 1 else 0 end) "Low Salary",
    sum(case when income between 20000 and 50000 then 1 else 0 end) "Average Salary",
    sum(case when income > 50000 then 1 else 0 end) "High Salary"
    from Accounts)

select category, accounts_count
  from category_table ct
UNPIVOT (accounts_count     #집계값을 표시할 칼럼 
            for category     #카테고리를 표시할 칼럼 
            in ([Low Salary], [Average Salary], [High Salary])) as Unpivoted

[파이썬 코드카타]

두 정수 사이의 합
https://school.programmers.co.kr/learn/courses/30/lessons/12912

 

1) 어떤 문제가 있었나

2) 내가 시도해본 건 무엇인가

3) 어떻게 해결했나

if 문으로 a와 b 크기에 따른 조건을 지정하고, for 문을 활용해 a와 b 사이의 합을 구함

def solution(a, b):
    answer = 0
    if b >= a:
        for i in range(a, b+1):
            answer = answer + i
    elif b < a:
        for j in range(b, a+1):
            answer = answer + j
    return answer


4) 무엇을 새롭게 알았나

for문을 이용하지 않고 간단히 푼 풀이들. for 문이 능사가 아니다.. 

#if문을 활용해 조건에 따라 함수 내 변수 순서를 변경
def solution(a, b):
    if a > b:
        a, b = b, a
    return sum(range(a, b + 1))
 
#min, max 함수로 a, b값이 지정되도록 구성 
def solution(a, b):  
    return sum(range(min(a, b), max(a, b)+1))