SQL & DB/PostgreSQL

[PostgreSQL] 값 비교 - 조건을 0과 1로 표현하기

YSY^ 2023. 3. 5. 18:04

DATASET QUERY

DROP TABLE IF EXISTS mst_users_with_card_number;
CREATE TABLE mst_users_with_card_number (
    user_id     varchar(255)
  , card_number varchar(255)
);

INSERT INTO mst_users_with_card_number
VALUES
    ('U001', '1234-xxxx-xxxx-xxxx')
  , ('U002', NULL                 )
  , ('U003', '5678-xxxx-xxxx-xxxx')
;

DROP TABLE IF EXISTS purchase_log;
CREATE TABLE purchase_log (
    purchase_id integer
  , user_id     varchar(255)
  , amount      integer
  , stamp       varchar(255)
);

INSERT INTO purchase_log
VALUES
    (10001, 'U001', 200, '2017-01-30 10:00:00')
  , (10002, 'U001', 500, '2017-02-10 10:00:00')
  , (10003, 'U001', 200, '2017-02-12 10:00:00')
  , (10004, 'U002', 800, '2017-03-01 10:00:00')
  , (10005, 'U002', 400, '2017-03-02 10:00:00')
;

 

조건을 0과 1로 표현하는 방법

1. case when 을 활용

2. sign 함수를 활용

- 양수라면 1, 0이라면 0, 음수라면 -1로 판정합니다.

select
m.user_id
,m.card_number
,count(p.user_id) as purchase_count
,case when m.card_number is not null then 1 else 0 end as has_card
,sign(count(p.user_id)) as has_purchased
from mst_users_with_card_number as m
left join
purchase_log as p
on m.user_id = p.user_id
group by m.user_id, m.card_number
order by m.user_id
;

- has_card의 경우 카드를 가지고 있는지 여부를 확인하는 컬럼이며, case when 구문을 활용

-has_purchased의 경우 구매했는지 여부를 확인하는 방법이며 purchase 기록이 0이라면 0을 출력하고 1이상이면 1을 출력

728x90
반응형