코드 6-1
SELECT user_id
, concat(pref_name, city_name) AS pref_city
FROM mst_user_location
CONCAT( )
함수는 concatenate two or more strings except NULL specified in the arguments (링크)
코드 6-2
SELECT year, q1, q2
-- Q1과 Q2의 매출 변화 평가하기
, CASE
WHEN q1 < q2 THEN '+'
WHEN q1 = q2 THEN ' '
ELSE '-'
END AS judge_q1_q2
-- Q1과 Q2의 매출액의 차이 계산하기
, q2 - q1 AS diff_q2_q1
-- Q1과 Q2의 매출 변화를 1, 0, -1로 표현하기
, sign(q2-q1) AS sign_q2_q1
FROM quarterly_sales
ORDER BY year
SIGN( )
함수는 매개변수가 양수라면 1, 0이라면 0, 음수라면 -1 리턴
return the sign of a given number (링크)
코드 6-3
SELECT year
, greatest(q1, q2, q3, q4) AS greatest_sales
, least(q1, q2, q3, q4) AS least_sales
FROM quarterly_sales
ORDER BY year
greatest( ) 와 least( )
함수는 최대/최소 값을 선택. 목록의 NULL 값은 무시한다. (링크)
코드 6-6
SELECT year
, (COALESCE(q1, 0) + COALESCE(q2, 0) + COALESCE(q3, 0) + COALESCE(q4, 0))
/ (SIGN(COALESCE(q1, 0)) + SIGN(COALESCE(q2, 0)) + SIGN(COALESCE(q3, 0)) + SIGN(COALESCE(q4, 0)))
AS average
FROM quarterly_sales
ORDER BY year
코드 6-7
SELECT dt, ad_id
-- , clicks / impressions
-- postgreSQL의 경우 정수를 나누면 소수점이 잘리므로 명시적으로 자료형 변환
, CAST(clicks AS double precision) / impressions AS ctr
-- 실수를 상수로 앞에 두고 계산하면 암묵적으로 자료형 변환이 일어남
, 100.0 * clicks / impressions AS ctr_as_percent
FROM advertising_stats
WHERE dt = '2017-04-01'
ORDER BY dt, ad_id
코드 6-8
SELECT dt, ad_id
-- 방법1
, CASE
WHEN impressions > 0 THEN 100.0 * clicks / impressions
END AS ctr_as_percent_by_case
-- 방법2
, 100.0 * clicks / NULLIF(impressions, 0) AS ctr_as_percent_by_null
FROM advertising_stats
ORDER BY dt, ad_id
sql
abs함수, power함수, sqrt함수
코드 6-9
SELECT abs(x1-x2) AS abs
, sqrt(power(x1-x2, 2)) AS rms
FROM location_1d
코드 6-10
SELECT sqrt(power(x1-x2, 2) + power(y1-y2, 2)) AS dist
FROM location_2d
코드 6-11
SELECT user_id
-- postgreSQL의 경우 interval 자료형의 데이터에 사칙 연산 적용하기
, register_stamp::timestamp AS register_stamp
, register_stamp::timestamp + '1 hour'::interval AS after_1_hour
, register_stamp::timestamp - '30 minutes'::interval AS before_30_minutes
FROM mst_users_with_dates
코드 6-16
SELECT user_id
, substring(register_stamp, 1, 10) AS register_date
, birth_date
-- 등록 시점의 나이 계산하기
, floor(
(CAST(REPLACE(substring(register_stamp, 1, 10), '-', '') AS integer)
- CAST(REPLACE(birth_date, '-', '') AS integer)
) / 10000
) AS register_age
-- 현재 시점의 나이 계산하기
, floor(
(CAST(REPLACE(CAST(current_date AS text), '-', '') AS integer)
- CAST(REPLACE(birth_date, '-', '') AS integer)
) / 10000
) AS current_age
FROM mst_users_with_dates