해당 회사의 문제를 유출하면 안 되므로 문제를 변형해서 풀 것임.
SQL Tryit Editor v1.6 (w3schools.com)
해당 사이트에서 제공하는 테이블을 이용하여 문제를 풀 것임.
문제 1) 좌표 관련 문제
해당 문제는 상당히 특이하다. SQL에서 좌표 간의 거리를 구하는 문제가 나온다면 당황스럽지 않은가?
나도 그렇다. 하지만 SQL도 결국에는 프로그래밍 언어이기 때문에 문제를 풀 수 있다.
( 해당 문제의 특수성 때문에 위의 사이트에서도 비슷한 테이블이 존재 하지 않아 가상의 테이블을 상상하면서 문제를 풀어보자.. :( )
(풀이 방법)
1. 이문제를 풀기 위해서는 변수를 지정하는 방법을 정확하게 알아야 한다.
2. 또한 원하는 행의 좌표만 구하고 싶기 때문에 select와, where 절을 적절히 사용할 줄 알아야 한다.
이 두가지를 인지하고 문제를 풀면 쉽게 풀린다. (모르면 못품ㅋ)
1. 변수선언: @[변수명] = [값] 형태로 넣을 수 있다. 여기서 조건을 추가해서 where절을 다이렉트로 넣을 수 없다.
select를 이용해서 순회하는듯하면서 써야한다 (for문이라고 생각하면 편할 듯)
결론적으로, 아래의 형태로 선언해야 한다.
SET @[변수명] = (SELECT [원하는 열] FROM [테이블 이름] WHERE [조건]);
위의 방법을 알고 나면 계산하는 공식만 쓰면 답은 간단하게 풀 수 있다.
[코드]
SET @a = (SELECT x FROM human_locations WHERE owner = 'KHS');
SET @b = (SELECT y FROM human_locations WHERE owner = 'KHS');
SELECT name, abs(x - @a) + abs(y - @b) as DISTANCE
from human_locations
order by distance desc limit 1
문제 2 ) 급여 관련 문제
위 사이트에서 제공해주는 [product] 테이블 차용해서 설명합니다.
ProductID ProductName SupplierID CategoryID Unit Price
1 | Chais | 1 | 1 | 10 boxes x 20 bags | 18 |
2 | Chang | 1 | 1 | 24 - 12 oz bottles | 19 |
3 | Aniseed Syrup | 1 | 2 | 12 - 550 ml bottles | 10 |
4 | Chef Anton's Cajun Seasoning | 2 | 2 | 48 - 6 oz jars | -22 |
5 | Chef Anton's Gumbo Mix | 2 | 2 | 36 boxes | 21.35 |
6 | Grandma's Boysenberry Spread | 3 | 2 | 12 - 8 oz jars | -25 |
7 | Uncle Bob's Organic Dried Pears | 3 | 7 | 12 - 1 lb pkgs. | 30 |
위의 형식을 취하는 테이블이 있다고 칩시다.
해당 ProductID, ProductName, SupplierID, CategoryID, Unit, Price 은 각각
상품 아이디, 상품 이름, 공급자 아이디, 카테고리 아이디, 상품 상세 목록, 구입 가격
을 의미한다고 합시다. 여기서 해당 상품들 중 반품되는 목록은 price가 -값 형태로 표기된다고 했을 때 구입된 상품의 합과
반품된 값의 합을 모두 출력하는 문제입니다.
출력할 때 아래의 표의 형식을 취한다고 합시다.
번호 | 가격 합 |
0 | (구입된 가격의 합) |
1 | (반품된 가격의 합) |
(알아야 할 개념)
1. union all의 효용
2. sum if의 사용 방법
union all 은 두 개의 select문으로 인한 출력을 합쳐주는 역할을 해줍니다. union all 없이 두개의 셀렉트 문을 출력하려고 시도하면 에러가 발생합니다.
sum안에 조건을 추가하여 원하는 입맛대로 sum을 할 수 있습니다.
형태는 아래와 같은 형태를 취합니다.
sum(if[조건], [조건을 만족시 더할 열명], [초기값])
[코드]
set @a = -1;
SELECT
(@a := @a + 1) as 구분,
sum(if(price > 0, price, 0)) as 금액
from products
union all
SELECT
(@a := @a + 1) as 구분,
abs(sum(if(price < 0, price, 0))) as 금액
from products
후기
엊그제? 풀이 쓴다는 걸 지금 쓰네요 ㅎㅎ
'SQL' 카테고리의 다른 글
SQL 여기서 정렬을 할려면 어떻게 해야 할까? (0) | 2022.11.05 |
---|---|
같은 속성끼리 무언가 계산 하는 법 - group by (0) | 2022.08.08 |
sql 문제 한 번 성공하니까 계속 풀려진다!! (0) | 2022.07.04 |
SQL_kit_[프로그래머스]- join (0) | 2022.06.12 |
SQL_kit_isnull[프로그래머스] (0) | 2022.06.05 |