SQL 문제풀이 복습
문제 링크
출력 결과에서 P1(id), P2(id)가 컬럼으로 구분되어야 한다?
→ join을 쓴다
절대값을 나타내는 abs 함수는 써 본 적이 있고,
그 외에는 따로 유의해야 할 건 없는 듯.
SELECT Least(p1.id, p2.id) AS "P1",
Greatest(p1.id, p2.id) AS "P2",
Abs(p1.x_value - p2.x_value) * Abs(p1.y_value - p2.y_value) AS "AREA"
FROM Points p1
JOIN Points p2
ON p1.x_value <> p2.x_value
AND p1.y_value <> p2.y_value
GROUP BY 1,
2
ORDER BY 3 DESC,
1 ASC,
2 ASC;
문제 링크
어떻게 풀어도 크게 어렵지 않은 문제.
SELECT s.company_id,
s.employee_id,
s.employee_name,
CASE
WHEN a.max_salary < 1000 THEN s.salary
WHEN a.max_salary BETWEEN 1000 AND 10000 THEN Round(s.salary * 0.76)
WHEN a.max_salary > 10000 THEN Round(s.salary * 0.51)
end AS "salary"
FROM Salaries s
JOIN (SELECT company_id,
Max(salary) AS "max_salary"
FROM Salaries
GROUP BY 1) a
ON s.company_id = a.company_id;
문제 링크
1트(7/19) 때는 CTE를 만들었는데
오늘은 그냥 서브쿼리로 해결했다.
팔리지 않은 아이템 카테고리(T-shirt)도 0 처리해서 출력해야 하기 때문에,
Items 테이블에서 카테고리의 고윳값들을 가져온 다음 join을 해 줘야 하는게
약간의 귀찮은 포인트.
SQL로 피벗테이블을 만들 줄만 안다면
그 귀찮음 외에 특별히 어려운 것은 없다.
※ 추가
날짜로부터 요일을 구할 때,
1트 때는 dayofweek을 썼고 오늘은 weekday를 썼다.
기능상으로는 큰 차이가 없는데 dayofweek은 1이 일요일, 7이 토요일이고
weekday는 0이 월요일, 6이 일요일이다.
이 문제에서는 피벗테이블이 월요일부터 시작하기 때문에
dayofweek를 쓸 경우 2부터 7까지 간 다음 마지막에 1을 써야 한다.
그래서 1트 때 약간 헷갈리기도 했는데,
그런 헷갈림을 방지하려면 아예 weekday로 쓰면 됨.
SELECT c.item_category AS "CATEGORY",
Ifnull(mon, 0) AS "MONDAY",
Ifnull(tue, 0) AS "TUESDAY",
Ifnull(wed, 0) AS "WEDNESDAY",
Ifnull(thu, 0) AS "THURSDAY",
Ifnull(fri, 0) AS "FRIDAY",
Ifnull(sat, 0) AS "SATURDAY",
Ifnull(sun, 0) AS "SUNDAY"
FROM (SELECT DISTINCT item_category
FROM Items) c
LEFT JOIN (SELECT item_category,
Max(CASE
WHEN dayofweek = 0 THEN sales
end) AS "mon",
Max(CASE
WHEN dayofweek = 1 THEN sales
end) AS "tue",
Max(CASE
WHEN dayofweek = 2 THEN sales
end) AS "wed",
Max(CASE
WHEN dayofweek = 3 THEN sales
end) AS "thu",
Max(CASE
WHEN dayofweek = 4 THEN sales
end) AS "fri",
Max(CASE
WHEN dayofweek = 5 THEN sales
end) AS "sat",
Max(CASE
WHEN dayofweek = 6 THEN sales
end) AS "sun"
FROM (SELECT Weekday(o.order_date) AS "dayofweek",
i.item_category,
Sum(o.quantity) AS "sales"
FROM Orders o
JOIN Items i
ON o.item_id = i.item_id
GROUP BY 1,
2) a
GROUP BY 1) b
ON c.item_category = b.item_category
ORDER BY 1;