SAP/ABAP 문법 | Open SQL

[SAP] 집계 ν•¨μˆ˜(Aggregate Function) - MIN, MAX, SUM, COUNT, GROUP BY, HAVING

μΈν¬λ§ˆν‹± 2025. 2. 14. 21:40

SAP ABAPμ—μ„œ 데이터λ₯Ό 효율적으둜 μ‘°νšŒν•˜κ³  λΆ„μ„ν•˜λ €λ©΄ 집계 ν•¨μˆ˜(Aggregate Function)λ₯Ό ν™œμš©ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. 집계 ν•¨μˆ˜λŠ” μ—¬λŸ¬ ν–‰(Row)의 값을 ν•˜λ‚˜μ˜ κ²°κ³Ό κ°’μœΌλ‘œ κ³„μ‚°ν•˜λŠ” ν•¨μˆ˜λ‘œ, SQLκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό 효과적으둜 μ²˜λ¦¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

이번 ν¬μŠ€νŒ…μ—μ„œλŠ” ABAPμ—μ„œ μ‚¬μš©ν•  수 μžˆλŠ” μ§‘계 ν•¨μˆ˜μ˜ μ’…λ₯˜μ™€ ν™œμš©λ²•μ„ μ •λ¦¬ν•΄λ³΄κ² μŠ΅λ‹ˆλ‹€.

 


πŸ“Œ 1. 집계 ν•¨μˆ˜(Aggregate Function)λž€?

집계 ν•¨μˆ˜λŠ” ν…Œμ΄λΈ”μ˜ μ—¬λŸ¬ ν–‰(Row) 데이터λ₯Ό ν•˜λ‚˜μ˜ κ°’μœΌλ‘œ λ³€ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄, 학생 ν…Œμ΄λΈ”μ—μ„œ μ΅œλŒ€ λ‚˜μ΄, μ΅œμ†Œ λ‚˜μ΄, 전체 학생 수, 평균 연봉 λ“±μ„ ꡬ할 λ•Œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

βœ… ABAPμ—μ„œ μ‚¬μš© κ°€λŠ₯ν•œ 집계 ν•¨μˆ˜

⭐ κ΄„ν˜Έμ•ˆμ— 띄어쓰기 κΌ­ μ£Όμ˜ν•  것!

집계 ν•¨μˆ˜ μ„€λͺ…
MIN( 컬럼λͺ… ) ν•΄λ‹Ή 컬럼의 μ΅œμ†Œκ°’ λ°˜ν™˜
MAX( 컬럼λͺ… ) ν•΄λ‹Ή 컬럼의 μ΅œλŒ€κ°’ λ°˜ν™˜
SUM( 컬럼λͺ… ) ν•΄λ‹Ή 컬럼의 λͺ¨λ“  값을 λ”ν•œ ν•©κ³„ λ°˜ν™˜
AVG( 컬럼λͺ… ) ν•΄λ‹Ή 컬럼의 ν‰κ· κ°’ λ°˜ν™˜
COUNT( * ) ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ μ „체 ν–‰ 개수 λ°˜ν™˜
COUNT( 컬럼λͺ… ) ν•΄λ‹Ή μ»¬λŸΌμ—μ„œ NULL이 μ•„λ‹Œ κ°’ 개수 λ°˜ν™˜

 

 

πŸ“Œ 2. 집계 ν•¨μˆ˜ μ‚¬μš©

ABAPμ—μ„œλŠ” μ§‘계 ν•¨μˆ˜μ™€ ν•¨κ»˜ SELECT SINGLE을 μ‚¬μš©ν•  수 μ—†μœΌλ©°, SELECT ... INTO κ΅¬λ¬Έμ„ ν™œμš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

βœ… μ•„λž˜ μ˜ˆμ‹œλŠ” ZSTUDENT1_07을 μ‚¬μš©ν•©λ‹ˆλ‹€.

 

1️⃣ MIN()κ³Ό MAX() μ‚¬μš©λ²• (μ΅œμ†Œκ°’, μ΅œλŒ€κ°’ κ΅¬ν•˜κΈ°)

DATA: lv_min_birth TYPE DATS,  " κ°€μž₯ 였래된 생일 (λ‚˜μ΄ 많음)
      lv_max_birth TYPE DATS.  " κ°€μž₯ μ΅œμ‹  생일 (λ‚˜μ΄ 적음)

SELECT MIN( STDBIRTH ), MAX( STDBIRTH )
  INTO (lv_min_birth, lv_max_birth)
  FROM ZSTUDENT1_07.

WRITE: 'κ°€μž₯ λ‚˜μ΄ λ§Žμ€ 학생 생일:', lv_min_birth,
       'κ°€μž₯ λ‚˜μ΄ μ–΄λ¦° 학생 생일:', lv_max_birth.

βœ” MIN(STDBIRTH)MAX(STDBIRTH)λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°€μž₯ 였래된 생일과 μ΅œμ‹  생일을 κ°€μ Έμ˜΄
βœ” INTO (λ³€μˆ˜1, λ³€μˆ˜2) ν˜•μ‹μœΌλ‘œ μ €μž₯

 

 2️⃣ SUM()κ³Ό AVG() μ‚¬μš©λ²• (합계 및 평균 κ΅¬ν•˜κΈ°)

DATA: lv_total_salary TYPE P DECIMALS 2,  " 총 연봉
      lv_avg_salary TYPE P DECIMALS 2.   " 평균 연봉

SELECT SUM( SALARY ), AVG( SALARY )
  INTO (lv_total_salary, lv_avg_salary)
  FROM ZSTUDENT1_07.

WRITE: '총 연봉 합계:', lv_total_salary,
       '평균 연봉:', lv_avg_salary.

βœ” SUM(SALARY) → 전체 κΈ‰μ—¬ 총합
βœ” AVG(SALARY) → 평균 κΈ‰μ—¬

 

3️⃣ COUNT() μ‚¬μš©λ²• (ν–‰ 개수 κ΅¬ν•˜κΈ°)

DATA: lv_total_students TYPE I.

SELECT COUNT( * ) INTO lv_total_students
  FROM ZSTUDENT1_07.

WRITE: '총 학생 수:', lv_total_students.

βœ” COUNT(*)λ₯Ό μ‚¬μš©ν•˜λ©΄ ν…Œμ΄λΈ”μ˜ 총 ν–‰ 수λ₯Ό κ°€μ Έμ˜¬ 수 있음
βœ” νŠΉμ • 쑰건을 μΆ”κ°€ν•΄μ„œ μ›ν•˜λŠ” λ°μ΄ν„°λ§Œ 개수 μ…€ μˆ˜λ„ 있음

 

DATA: lv_cs_students TYPE I.

SELECT COUNT( * ) INTO lv_cs_students
  FROM ZSTUDENT1_07
  WHERE STDMAJOR = '컴퓨터'.

WRITE: '컴퓨터곡학 전곡 학생 수:', lv_cs_students.

βœ” μ»΄ν“¨ν„° 전곡 학생 수만 카운트

 

4️⃣ GROUP BY와 ν•¨κ»˜ μ‚¬μš©ν•˜κΈ° (집계 ν•¨μˆ˜ + κ·Έλ£Ήν™”)

GROUP BYλ₯Ό μ‚¬μš©ν•˜λ©΄ νŠΉμ • μ»¬λŸΌμ„ κΈ°μ€€μœΌλ‘œ 데이터λ₯Ό κ·Έλ£Ήν™”ν•˜μ—¬ 집계할 수 μžˆμŠ΅λ‹ˆλ‹€.

βœ… 전곡별 학생 수 κ΅¬ν•˜κΈ°

DATA: lt_result TYPE TABLE OF ZSTUDENT1_07,
      ls_result TYPE ZSTUDENT1_07.

SELECT STDMAJOR, COUNT( * )
  INTO TABLE lt_result
  FROM ZSTUDENT1_07
  GROUP BY STDMAJOR.

LOOP AT lt_result INTO ls_result.
  WRITE: / ls_result-STDMAJOR, ls_result-STDBIRTH.
ENDLOOP.

βœ” GROUP BY STDMAJOR → μ „κ³΅λ³„λ‘œ κ·Έλ£Ήν™”
βœ” COUNT(*) → 각 전곡에 μ†ν•œ 학생 수λ₯Ό λ°˜ν™˜

 

5️⃣ HAVINGκ³Ό ν•¨κ»˜ μ‚¬μš©ν•˜κΈ° (쑰건 μΆ”κ°€)

집계 κ²°κ³Όμ—μ„œ νŠΉμ • 쑰건을 μΆ”κ°€ν•˜λ €λ©΄ HAVING을 μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

βœ… 학생 μˆ˜κ°€ 3λͺ… 이상인 μ „κ³΅λ§Œ 쑰회

DATA: lt_result TYPE TABLE OF ZSTUDENT1_07,
      ls_result TYPE ZSTUDENT1_07.

SELECT STDMAJOR, COUNT( * )
  INTO TABLE lt_result
  FROM ZSTUDENT1_07
  GROUP BY STDMAJOR
  HAVING COUNT( * ) >= 3.

LOOP AT lt_result INTO ls_result.
  WRITE: / ls_result-STDMAJOR, ls_result-STDBIRTH.
ENDLOOP.

βœ” HAVING COUNT(*) >= 3 → ν•™μƒμ΄ 3λͺ… 이상인 μ „κ³΅λ§Œ 좜λ ₯