HANA SQL 특화 — 날짜 · 문자열 · TOP · MAP · NDIV0

SAP HANA 에서 실무에 바로 쓰는 날짜·문자열 함수와 TOP, MAP, NDIV0, 정수 나눗셈·NULL 정렬 규칙을 익힙니다.

1. HANA 날짜 함수

SAP 날짜(DATS)는 'YYYYMMDD' 문자열입니다. HANA 날짜 함수는 문자열을 날짜로 바꿔 계산합니다.

목적함수
차이DAYS_BETWEEN(시작, 끝)
더하기ADD_DAYS(d, n), ADD_MONTHS(d, n)
요일WEEKDAY(d)
주차ISOWEEK(d)
월말LAST_DAY(d)
형식TO_VARCHAR(d, 'YYYY-MM')
SELECT VBELN,
       DAYS_BETWEEN(TO_DATE(ERDAT, 'YYYYMMDD'), '20251231') AS DAYS_TO_YEAR_END
FROM VBAK
WHERE ERDAT >= '20250101';
  • DAYS_BETWEEN(a, b) 는 b − a 입니다. 연체일은 DAYS_BETWEEN(만기일, 기준일) 로 양수가 됩니다.
  • 월을 더할 때 ADD_MONTHS('20250131', 1) 처럼 월말 처리 규칙을 확인하세요.
  • 기준일은 문제에 주어진 as_of_date 를 씁니다. CURRENT_DATE 를 쓰면 실행 시점마다 결과가 달라집니다.
  • ISO 주차는 연도 경계에서 1월 초가 전년 마지막 주에 속할 수 있습니다.

문제

  1. 2025년 요일별 출고 건수 (초급)
  2. 판매 사무소별 희망 납품 리드타임 (초급)
  3. 지급 기한이 지난 고객 미결 청구 항목 상위 10건 (중급)
  4. 2025년 4분기 ISO 주차별 국내 수주 현황 (중급)
  5. 증빙일 후 두 달이 지난 고객 미결 청구 (중급)
  6. 납품 예정월별 입고 편차와 월 넘김 입고 (고급)
  7. 익월 말 정산 규칙에 따른 수금 정산일별 미결 채권 (고급)

2. HANA 문자열 함수

SAP 키의 앞자리 0, 이름의 첫 단어, 여러 행의 코드 목록을 다룹니다.

목적함수
앞자리 0 지우기LTRIM(KUNNR, '0')
자리 채우기LPAD(s, n, '0')
앞/뒤 자르기SUBSTR_BEFORE(s, 구분자), SUBSTR_AFTER(s, 구분자)
위치LOCATE(s, 검색어)
목록 합치기STRING_AGG(표현식, ', ' ORDER BY …)
길이LENGTH(s)
SELECT SUBSTR_BEFORE(NAME1, ' ') AS FIRST_WORD, COUNT(*) AS CUSTOMERS
FROM KNA1
WHERE LAND1 = 'KR'
GROUP BY SUBSTR_BEFORE(NAME1, ' ');
  • LTRIM(KUNNR, '0') 은 문자 집합 '0' 을 지웁니다. 공백을 지우는 LTRIM 과 다릅니다.
  • STRING_AGG 는 GROUP BY 마다 값을 이어 붙입니다. 정렬을 지정하지 않으면 순서가 보장되지 않습니다.
  • 이름에 공백이 없으면 SUBSTR_BEFORE 는 전체 문자열을 돌려줍니다. 빈 값과 NULL 을 구분하세요.
  • SUBSTRING 은 시작 위치가 1부터입니다.

문제

  1. 국내 공급업체의 레거시 인터페이스용 번호 변환 (초급)
  2. 국가별 공급업체 수와 공급업체 번호 목록 (초급)
  3. 2025년 4분기 고객별 표준 오더 번호 목록 (중급)
  4. 고객 이름 첫 단어별 고객 묶음 (중급)
  5. 2025년 월별 사용된 회계 전표 유형 목록 (중급)
  6. 반품 이력이 있는 고객의 문서 유형별 판매 문서 번호 목록 (고급)
  7. 판매 사무소별 2025년 거래 고객 코드 목록과 최다 오더 고객 (고급)

3. TOP · MAP · NDIV0 와 HANA 다운 쿼리

HANA 에서 자주 쓰는 실무 표현입니다.

SELECT TOP 10 VBELN, KUNNR, NETWR
FROM VBAK
WHERE WAERK = 'KRW'
ORDER BY NETWR DESC;

SELECT MAP(MTART, 'FERT', '완제품', 'HALB', '반제품', '기타') AS TYPE_NAME,
       COUNT(*) AS CNT
FROM MARA
GROUP BY MAP(MTART, 'FERT', '완제품', 'HALB', '반제품', '기타');
  • TOP n 은 ORDER BY 와 함께 써야 "상위"가 됩니다. ORDER BY 가 없으면 임의의 n 행입니다.
  • MAP(값, 키1, 값1, 키2, 값2, …, 기본값) 은 단순 코드 치환을 짧게 씁니다. 여러 조건이 필요하면 CASE.
  • 나눗셈은 정수/정수일 때 소수 자릿수가 제한됩니다. 비율은 CAST(분자 AS DOUBLE) / 분모 또는 분자 * 1.0 / 분모 로 계산하세요.
  • NDIV0 는 0 으로 나누는 상황을 처리합니다. 그래도 결과가 0 인지 NULL 인지 확인하세요.
  • NULL 정렬 기본값은 DB·정렬 방향에 따라 다릅니다. 필요하면 NULLS FIRST / NULLS LAST 를 명시하세요.

문제

  1. 한국 법인 구매 품목 중 금액이 큰 5건 (초급)
  2. 금액 상위 10개 원화 판매 품목과 납품 상태 (중급)
  3. 플랜트별 구매 품목 납품 완료율 (중급)
  4. 품목 납품 상태별 판매 품목 수와 비중 (중급)
  5. 전월보다 불량률이 가장 크게 줄어든 3개 달 (고급)
  6. 입고 검사 이력이 오래된 공급업체 점검표 (고급)