본문 바로가기

Data Science/SQL86

[SQL/오답] 복합 조건 필터링; CASE WHEN과 UNION ALL (LeetCode1873 Easy) 1. Problem각 사원의 보너스를 계산해야 한다. 보너스 지급 조건은 두 가지가 동시에 충족되어야 한다.사원 번호(employee_id)가 홀수일 것사원 이름(name)이 'M'으로 시작하지 않을 것 이 조건에 부합하면 급여의 100%를 보너스로 지급하고, 그렇지 않으면 0을 지급한다. 숫자 데이터의 산술 연산과 문자열의 패턴 매칭을 동시에 활용해야 하는 문제이다.2. Solution논리적으로 데이터를 분리하는 UNION ALL 방식과 연산 효율을 높인 CASE WHEN 방식으로 풀이할 수 있다.[방법 A] UNION ALL을 활용한 집합 결합 보너스 대상자와 비대상자를 각각 추출하여 수직으로 통합한다. 각 조건의 여집합을 명확히 구분해야 데이터 중복이나 누락을 방지할 수 있다.[방법 B] CASE .. 2026. 2. 16.
[SQL/오답] 와이드 포맷을 롱 포맷으로: UNION ALL으로 Unpivot (LeetCode1795 Easy) 1. Problem하나의 상품(product_id)에 대해 여러 상점(store1, store2, store3)의 가격이 컬럼으로 나열된 와이드 포맷 데이터를, 각 상점별 가격이 행으로 쌓이는 롱 포맷으로 변환해야 한다. 이때 특정 상점에 가격 정보가 없는(NULL) 행은 결과에서 제외해야 한다는 제약 조건이 있다.2. Solution각 상점별 데이터를 독립적으로 추출한 후, 이를 수직으로 통합하는 UNION ALL 방식을 사용한다.정적 리터럴 사용: 컬럼명인 store1 등을 문자열 'store1'으로 선언하여 store라는 새로운 컬럼의 데이터 값으로 활용한다.UNION ALL의 효율성: 각 서브쿼리가 추출하는 상점 도메인이 서로 다르므로 중복 제거 과정이 없는 UNION ALL을 사용하는 것이 연산.. 2026. 2. 15.
[SQL/오답] 비즈니스 로직에 따른 집합 분리: UNION과 WHERE OR의 (LeetCode1789 Easy) 1. Problem모든 사원의 '주 부서(Primary Department)'를 보고해야 한다. 조건은 다음과 같다.소속 부서가 여러 개인 사원: primary_flag = 'Y'인 부서를 선택한다.소속 부서가 단 하나인 사원: 플래그가 'N'이더라도 해당 부서를 선택한다. 단순히 특정 값을 찾는 것을 넘어, 사원별 소속 부서 개수라는 **'상태'**에 따라 적용할 필터링 규칙이 달라지는 것이 이 문제의 핵심이다.2. Solution복잡한 단일 로직 대신, 두 가지 케이스를 각각 추출하여 합치는 UNION 전략과 서브쿼리를 이용한 필터링 전략으로 풀이할 수 있다.[방법 A] 분할 정복: UNION을 이용한 집합 결합 논리적으로 가장 명확한 방법이다. 'Y' 플래그를 가진 집단과 소속 부서가 하나인 집단을.. 2026. 2. 15.
[SQL/오답] 문자열 가공; CONCAT과 SUBSTR/UPPER/LOWER을 활용한 이름 표준화 (LeetCode1667 Easy) 1. ProblemUsers 테이블의 name 컬럼에 제멋대로 섞여 있는 대소문자를 정제해야 한다. 오직 첫 글자만 대문자로, 나머지는 소문자로 변환하여 출력하는 것이 목표이다. 실무에서 이름이나 주소 등 텍스트 데이터를 통일성 있게 관리하기 위해 반드시 필요한 과정이다.2. Solution문자열을 분해한 뒤 각각 대소문자 처리를 거쳐 다시 조립하는 '추출-변환-결합' 전략을 사용한다.SUBSTR(name, 1, 1): 1번 인덱스부터 1글자를 가져와 UPPER 처리한다.SUBSTR(name, 2): 2번 인덱스부터 문자열 끝까지 가져와 LOWER 처리한다. 길이를 생략하면 자동으로 끝까지 추출하는 특성을 활용한다.CONCAT: 처리된 두 조각을 하나의 문자열로 완성한다.3. Takeaway (문자열 핸.. 2026. 2. 15.
[SQL/오답] 거래 없는 방문자 추출: WHERE NOT IN, LEFT JOIN, IS NULL 데이터 공백 분석 (LeetCode1581 Easy) 1. Problem몰을 방문했지만 거래(Transaction)를 한 건도 발생시키지 않은 방문 건수를 고객별로 집계해야 한다. 단순히 '한 번이라도 산 적 없는 고객'을 찾는 것이 아니라, **'거래가 발생하지 않은 방문 그 자체'**를 카운트하는 것이 핵심이다. 즉, 평소 물건을 잘 사던 고객이라도 특정 방문 때 구매 없이 나갔다면 그 횟수를 집계에 포함해야 한다.2. Solution거래 테이블과 매칭되지 않는 방문 기록을 효율적으로 필터링하기 위해 두 가지 전략을 사용한다.[전략 A] 필터링 중심: LEFT JOIN + IS NULL (권장) Visits 테이블을 기준으로 Transactions 테이블을 붙였을 때, 거래 정보가 없어 NULL이 된 행들만 먼저 골라낸 뒤 집계한다.[전략 B] 논리 중.. 2026. 2. 15.
[SQL/오답] LIKE의 함정과 REGEXP 활용한 패턴 매칭 (LeetCode 1527 Easy) 1. Problem병원 환자 데이터에서 'Type I Diabetes'를 앓고 있는 환자를 찾아야 한다. 조건은 질병 코드(conditions) 중 하나가 DIAB1으로 시작해야 한다는 것이다. 하나의 컬럼에 공백으로 구분된 여러 질병 코드가 섞여 있으므로, 다른 단어의 일부로 포함된 DIAB1(예: SADIAB1)은 제외하고 '단어의 시작점'에 위치한 것만 골라내는 것이 기술적 과제이다.2. Solution단순 포함 조건(%DIAB1%)의 오류를 극복하기 위해 공간적 경계를 고려한 두 가지 접근법을 사용한다.[방법 A] LIKE를 이용한 이중 필터링DIAB1이 문장의 맨 앞에 오는 경우와, 중간에 공백 뒤에 오는 경우를 각각 지정한다.[방법 B] 정규표현식(REGEXP)을 이용한 경계 탐색 (권장) 단.. 2026. 2. 15.