숫자 자료형과 문자열 사이 자료형 변환
CAST([컬럼명] AS [변경할 자료형])
[컬럼명]::[변경할 자료형]
SELECT dt, CAST(dt AS VARCHAR) as yyyymmdd
문자형 | 숫자형 | 날짜형 | 논리형 |
---|---|---|---|
CHAR, VARCHAR, LONG, CLOB | INT, BIGINT, NUMERIC, FLOAT, DOUBLE | DATE, TIMESTAMP | BOOLEAN |
문자형 데이터 연결
CONCAT([문자열1], [문자열2], ..., [문자열N])
문자열1 || 문자열2 || ... || 문자열N
특정 값 치환
COALESCE([컬럼명], [변경 후 값])
변경 전/후의 자료형이 동일해야 한다.
조건별 GROUPING
CASE WHEN [조건] THEN [변경할 값] END
CASE WHEN gender = 'M' THEN '남성'
WHEN gender = 'F' THEN '여성'
ELSE 'NA'
END
ELSE
를 제외하면 M
과 F
이외의 값은 NULL
처리 됨SELECT CASE WHEN i.item_name LIKE '%바지%' THEN '바지류' -- 치마바지라면!?
WHEN i.item_name LIKE '%치마%' THEN '치마류'
WHEN i.item_name LIKE '%원피스%' THEN '원피스류'
ELSE '미분류'
END AS item_type, COUNT(i.item_name), SUM(gmv) AS gmv
문자형 데이터 자르기
LEFT([컬럼명], [왼쪽에서부터 포함할 문자 수])
RIGHT([컬럼명], [오른쪽에서부터 포함할 문자 수])
SUBSTRING([컬럼명], [시작위치],[포함할 문자 수])
SELECT dt, LEFT(CAST(dt AS VARCHAR),4) AS yyyy,
SUBSTRING(CAST(dt AS VARCHAR),5,2) AS mm,
RIGHT(CAST(dt AS VARCHAR),2) AS dd
FROM online_order oo
특정 문자열 자르기
특정 문자열을 임의값으로 변경
대문자 / 소문자로 변경
문자열의 길이 반환
날짜 관련 함수는 SQL에 따라 문법이 다르므로 사용하고 있는 SQL 문법에 맞는지 서치 해야함
now() in oracle
과 같이 서치해서 사용
날짜 자료형을 문자열로 변환
TO_CHAR([컬럼명], 'yyyymmdd')
-- 표현 형식 변경
SELECT TO_CHAR(NOW(), 'yyyy / mm / dd')
SELECT TO_CHAR(NOW(), 'yyyy - mm - dd')
문자열을 날짜 자료형으로 변환
TO_DATE([컬럼명], 'yyyymmdd')
-- 날짜 더하기
SELECT NOW() + INTERVAL '1 MONTH'
-- 날짜 빼기
SELECT NOW() + INTERVAL '-1 YEAR'
SELECT NOW() - INTERVAL '1 DAY'
날짜 데이터 간 차이를 반환
DATEDIFF('day', [날짜], [날짜])
날짜로부터 년도, 월, 주 등을 확인
SELECT DATE_PART('YEAR', NOW()) -- 주 SELECT DATE_PART('WEEK', NOW())
현재 날짜를 기준으로 시작일 반환
DATE_TRUNC('quarter', NOW())
분기의 시작일
나눗셈의 경우 numeric 자료형이 하나라도 있어야 제대로 적용
연산 값을 집계할 때 연산 전 컬럼에 집계함수를 각각 적용해 주어야 함
SELECT c.cate1,
SUM(CAST(discount AS numeric)) / SUM(gmv) AS discount_rate,
SUM(gmv) - SUM(discount) AS paid_amount,
SUM(CAST(product_profit AS numeric)) / SUM(gmv) AS product_magin,
SUM(CAST(total_profit AS numeric)) / SUM(gmv) AS total_magin
FROM online_order oo
JOIN item i ON oo.itemid = i.id
JOIN category c ON i.category_id = c.id
GROUP BY 1
ORDER BY 3
절대값 반환
반올림 / 올림 / 내림
ROUND([적용할 컬럼], [표시할 소수점자리])
SELECT c.cate1,
ROUND(SUM(CAST(discount AS numeric)) / SUM(gmv),2) AS discount_rate,
SUM(gmv) - SUM(discount) AS paid_amount,
ROUND(SUM(CAST(product_profit AS numeric)) / SUM(gmv),2) AS product_magin,
ROUND(SUM(CAST(total_profit AS numeric)) / SUM(gmv) *100) || '%' AS total_magin
FROM online_order oo
JOIN item i ON oo.itemid = i.id
JOIN category c ON i.category_id = c.id
GROUP BY 1
ORDER BY 3
COUNT([컬럼명])
,COUNT(DISTINCT [컬럼명])
SELECT i.item_name
, SUM(unitsold) AS unitsold
, COUNT(DISTINCT userid) AS user_count
, ROUND(SUM(CAST(gmv AS numeric)) / COUNT(DISTINCT userid)) AS avg_gmv_per_customer
FROM online_order oo
JOIN item i ON oo.itemid = i.id
GROUP BY 1
ORDER BY 4 DESC