Database/SQL practice

여러개의 값 비교

보늴 2022. 3. 7. 15:27

postgreSQL, 

출처 - 데이터분석을 위한 SQL 레시피

 

 

 

SELECT years,q1,q2,
CASE 
WHEN q1<q2 THEN '+'
WHEN q1=q2 THEN ' '
ELSE '-'
END AS judge_q1_q2
FROM quarterly_sales 

 

SELECT years,q1,q2,
q2-q1 AS diff_q2_q1
,sign(q2-q1) AS sign_q2_q1
FROM quarterly_sales 

 

 

#최대최소 매출 - greatest, latest 함수


SELECT years, GREATEST(q1,q2,q3,q4) AS GREATEST_sales,
least(q1,q2,q3,q4) AS least_sales
FROM quarterly_sales 
ORDER BY years;

#null값 0대체 후 평균계산


SELECT years,(COALESCE(q1,0)+COALESCE(q2,0)+COALESCE(q3,0)+COALESCE(q4,0))/4
AS average
FROM quarterly_sales 
ORDER BY years

 

postgreSQL은 정수로 나누면 소수점이 잘리므로 명시적 자료 변환 일어남

실수를 상수로 앞에 두고 계산하면(100,0, 30,0과 같이) 암묵적 자료변환이 일어남 

 

 

 

# 다른 데이터로 가공연습

 

DROP TABLE IF EXISTS advertising_stats;
CREATE TABLE advertising_stats (
    dt          varchar(255)
  , ad_id       varchar(255)
  , impressions integer
  , clicks      integer
);

INSERT INTO advertising_stats
VALUES
    ('2017-04-01', '001', 100000,  3000)
  , ('2017-04-01', '002', 120000,  1200)
  , ('2017-04-01', '003', 500000, 10000)
  , ('2017-04-02', '001',      0,     0)
  , ('2017-04-02', '002', 130000,  1400)
  , ('2017-04-02', '003', 620000, 15000)
;

 

 

 

#분모를 0으로 나누고 싶지 않을 때 분모가 0인 애들 NULL로 두기


SELECT dt,ad_id,
CASE WHEN impressions>0 THEN 100.0 * clicks/impressions # case-end문 사용
END AS ctr_as_percent_by_case,
100.0*clicks/NULLIF(impressions,0) AS ctr_as_percent_by_null # nullif함수 사용


FROM advertising_stats