본문 바로가기

SQL

어떤회사의 코딩테스트 - SQL 문제 풀이

728x90

해당 회사의 문제를 유출하면 안 되므로 문제를 변형해서 풀 것임.

SQL Tryit Editor v1.6 (w3schools.com)

 

SQL Tryit Editor v1.6

WebSQL stores a Database locally, on the user's computer. Each user gets their own Database object. WebSQL is supported in Chrome, Safari, Opera, and Edge(79). If you use another browser you will still be able to use our Try SQL Editor, but a different ver

www.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

후기

 

엊그제? 풀이 쓴다는 걸 지금 쓰네요 ㅎㅎ

728x90