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월 초가 전년 마지막 주에 속할 수 있습니다.
문제
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부터입니다.
문제
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를 명시하세요.