https://school.programmers.co.kr/learn/courses/30/lessons/59041
문제의 풀이는 동명의 이름을 찾고 그 이름에 몇마리가 있는지 찾는것입니다.
select *
from (select NAME, count(name) as COUNT
from animal_ins
where name is not NULL
group by NAME)X
where COUNT>=2
order by NAME
from에 테이블에서 동물의 이름인 NAME 컬럼, 각각의 이름의 수를 카운트하는 COUNT 컬럼을 선택하였습니다.
그리고 조건중 NULL값이 없어야 하므로 is not NULL을 통해서 널값을 미포함시켰습니다.
그리고 이름의 각각의 수를 카운트 하기위해서 NAME으로 그룹을 만들었습니다.
쿼리를 빠져 나와서 조건에 count의 수가 2이상이고
정렬은 NAME의 오름차순으로 정렬하였습니다.
https://school.programmers.co.kr/learn/courses/30/lessons/131530
다음은 어느 의류 쇼핑몰에서 판매중인 상품들의 정보를 담은 PRODUCT
테이블입니다. PRODUCT
테이블은 아래와 같은 구조로 되어있으며, PRODUCT_ID
, PRODUCT_CODE
, PRICE
는 각각 상품 ID, 상품코드, 판매가를 나타냅니다.
Column name | Type | Nullable |
---|---|---|
PRODUCT_ID | INTEGER | FALSE |
PRODUCT_CODE | VARCHAR(8) | FALSE |
PRICE | INTEGER | FALSE |
상품 별로 중복되지 않는 8자리 상품코드 값을 가지며 앞 2자리는 카테고리 코드를 나타냅니다.
PRODUCT
테이블에서 만원 단위의 가격대 별로 상품 개수를 출력하는 SQL 문을 작성해주세요. 이때 컬럼명은 각각 컬럼명은 PRICE_GROUP, PRODUCTS로 지정해주시고 가격대 정보는 각 구간의 최소금액(10,000원 이상 ~ 20,000 미만인 구간인 경우 10,000)으로 표시해주세요. 결과는 가격대를 기준으로 오름차순 정렬해주세요.
예를 들어 PRODUCT
테이블이 다음과 같다면
PRODUCT_ID | PRODUCT_CODE | PRICE |
---|---|---|
1 | A1000011 | 10000 |
2 | A1000045 | 9000 |
3 | C3000002 | 22000 |
4 | C3000006 | 15000 |
5 | C3000010 | 30000 |
6 | K1000023 | 17000 |
만원 단위의 가격대 별로 상품을 나누면
PRODUCT_ID
가 2인 상품 1개,PRODUCT_ID
가 1, 4, 6인 상품 3개,PRODUCT_ID
가 3인 상품 1개,PRODUCT_ID
가 5인 상품 1개,에 각각 해당하므로 다음과 같이 결과가 나와야 합니다.
PRICE_GROUP | PRODUCTS |
---|---|
0 | 1 |
10000 | 3 |
20000 | 1 |
30000 | 1 |
SELECT TRUNCATE((PRICE/10000),0)*10000 AS PRICE_GROUP, COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP ASC
ANIMAL_OUTS
테이블은 동물 보호소에서 입양 보낸 동물의 정보를 담은 테이블입니다. ANIMAL_OUTS
테이블 구조는 다음과 같으며, ANIMAL_ID
, ANIMAL_TYPE
, DATETIME
, NAME
, SEX_UPON_OUTCOME
는 각각 동물의 아이디, 생물 종, 입양일, 이름, 성별 및 중성화 여부를 나타냅니다.
NAME | TYPE | NULLABLE |
---|---|---|
ANIMAL_ID | VARCHAR(N) | FALSE |
ANIMAL_TYPE | VARCHAR(N) | FALSE |
DATETIME | DATETIME | FALSE |
NAME | VARCHAR(N) | TRUE |
SEX_UPON_OUTCOME | VARCHAR(N) | FALSE |
보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다. 0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요. 이때 결과는 시간대 순으로 정렬해야 합니다.
SQL문을 실행하면 다음과 같이 나와야 합니다.
HOUR | COUNT |
---|---|
0 | 0 |
1 | 0 |
2 | 0 |
3 | 0 |
4 | 0 |
5 | 0 |
6 | 0 |
7 | 3 |
8 | 1 |
9 | 1 |
10 | 2 |
11 | 13 |
12 | 10 |
13 | 14 |
14 | 9 |
15 | 7 |
16 | 10 |
17 | 12 |
18 | 16 |
19 | 2 |
20 | 0 |
21 | 0 |
22 | 0 |
23 | 0 |
set @hour=-1;
select @hour := @hour +1 as HOUR,(
select count(*)
from animal_outs
where @hour = HOUR(datetime)) as COUNT
from animal_outs
where @hour<23
이 문제를 풀기 위해서는 SET이라는 문법을 이용해서 새로운 변수를 할당해주고 서브쿼리를 이용해야합니다.
이렇게 하는 이유는 DATETIME라는 컬럼에서 0시~23시 까지 연속적으로 있는 것이 아니라 중간에 몇몇빠지는 시간대가 있기 때문입니다.
SET이라는 문법은 Python 문법을 예로 든다면 for문과 비슷합니다.
cnt=0
for n in range(0,24):
cnt+=n
위의 테이블에서 쿼리문을 작성한다면
SET @HOUR=-1;
SELECT @HOUR := @HOUR+1 AS HOUR
FROM ANIMAL_OUTS
위의 표현으로 쿼리문을 한다면 HOUR라는 컬럼에 1부터 N-1개의 로우가 생성이 될것입니다.
그리고 ANIMAL_OUTS테이블에 DATETIME컬럼에 @HOUR과 같은 값을 가지는 데이터를 COUNT하면
SET @HOUR = -1
SELECT @HOUR := +1 AS HOUR,(
SELECT COUNT(*)
FROM ANIMAL_OUTS
WHERE @HOUR=HOUR(DATETIME)) AS COUNT
FROM ANIMAL_OUTS
WHERE @HOUR<24
그리고 마지막에 WHERE절에서 @HOUR의 제한을 걸어줌으로서 0시~23시까지 로우를 만들어 줍니다