본문 바로가기

데이터베이스/Oracle

[MySQL/level 2] 분기별 분화된 대장균의 개체 수 구하기 - 299308 (MySQL - QUARTER(date), Oracle - TO_CHAR(date, 'Q'))

문제

각 분기(QUARTER)별 분화된 대장균의 개체의 총 수(ECOLI_COUNT)를 출력하는 SQL 문을 작성해주세요. 이때 각 분기에는 'Q' 를 붙이고 분기에 대해 오름차순으로 정렬해주세요. 대장균 개체가 분화되지 않은 분기는 없습니다.

 

MySQL

  • QUARTER(date)
    • The QUARTER() function returns the quarter of the year for a given date value (a number from 1 to 4)
      날짜를 분기로 바꿔줍니다.
Parameter Description
date Required. The date or datetime to extract the quarter from
  • CONCAT()
    • The CONCAT() function adds two or more expressions together.
      표현들을 연결해 줍니다.
Parameter  Description
expression1,
expression2,
expression3,
etc.
Required. The expressions to add together.
Note: If any of the expressions is a NULL value, it returns NULL

 

MySQL - Code

  • 문제 조건 1. 각 분기(QUARTER)별 분화된
    • QUARTER 함수를 써서 각 분기를 구합니다.
  • 문제 조건 2. 대장균의 개체의 총 수(ECOLI_COUNT)
    • 대장균 개체는 각 ID로 나뉘기 때문에, COUNT 함수 사용합니다.
    • COUNT한 값을 분기 그룹으로 나누어야 하기 때문에 GROUP BY QUARTER*
      *MySQL에서는 ALIAS로 조건을 줄 수 있습니다.
  • 문제 조건 3. 이때 각 분기에는 'Q' 를 붙이고
    • 분기 값 + 'Q'를 해야하기 때문에 CONCAT 함수 사용합니다.
  • 문제 조건 4. 분기에 대해 오름차순으로 정렬
    • 오름차순 정렬이기 때문에 ORDER BY QUARTER
SELECT CONCAT(QUARTER(DIFFERENTIATION_DATE), "Q") AS QUARTER, COUNT(ID) AS ECOLI_COUNT
FROM ECOLI_DATA
GROUP BY QUARTER
ORDER BY QUARTER

 

Oracle

  • 날짜를 분기로 변환해 주는 함수
    • MySQL: QUARTER(date)
    • Oracle: TO_CHAR(date, 'Q')

 

Oracle - Code

  • 본 문제에 대해서는 현재 프로그래머스에서 MySQL만 지원하기 때문에 직접 테이블을 만들어서 풀어보았습니다.
SQL> CREATE TABLE ECOLI_DATA (
  2      ID INTEGER NOT NULL,
  3      PARENT_ID INTEGER,
  4      SIZE_OF_COLONY INTEGER NOT NULL,
  5      DIFFERENTIATION_DATE DATE NOT NULL,
  6      GENOTYPE INTEGER NOT NULL
  7  );
테이블이 생성되었습니다.

SQL> INSERT INTO ECOLI_DATA VALUES(1, NULL, 10, TO_DATE('2019/01/01', 'YYYY/MM/DD'), 5);
1 개의 행이 만들어졌습니다.
.
.
.

SQL> SELECT * FROM ECOLI_DATA;

        ID  PARENT_ID SIZE_OF_COLONY DIFFEREN   GENOTYPE
---------- ---------- -------------- -------- ----------
         1                        10 19/01/01          5
         2                         2 19/05/01          3
         3          1            100 20/01/01          4
         4          2             17 22/04/01          4
         5          2             10 20/09/01          6
         6          4            101 21/12/01         22

6 행이 선택되었습니다.

SQL> SELECT TO_CHAR(DIFFERENTIATION_DATE, 'Q') AS QUARTER, COUNT(ID) AS ECOLI_COUNT
  2  FROM ECOLI_DATA
  3  GROUP BY TO_CHAR(DIFFERENTIATION_DATE, 'Q')
  4  ORDER BY QUARTER;

QU ECOLI_COUNT
-- -----------
1            2
2            2
3            1
4            1

 

 

 

반응형