GROUP BY
GROUP BY 절은 특정 열을 그룹으로 묶어 집계 된 데이터를 낼 수 있다. 예를 들어 이전 포스팅 (ABAP Open SQL SELECT 문: 집계 함수 SUM, AVG, MAX, MIN 등) 에서 SUM 으로 필드의 값을 합쳐 출력을 했는데, 지정한 필드의 값 끼리 묶어 세부적인 합계를 얻고 싶다 등의 경우 사용할 수 있다.
다음 코드는 carrid 값 별로 price 를 더해 출력하는 코드다. 참고로 INTO CORRESPONDING FIELDS OF TABLE 옵션을 사용할 때, AS 로 제대로 된 필드 명을 지정해주지 않으면 담기지 않는다. (AS 는 조회 한 필드의 명칭을 별도로 지정 할 때 사용한다.)
TYPES: BEGIN OF ty_table,
carrid LIKE sflight-carrid,
price LIKE sflight-price,
END OF ty_table.
DATA: lt_table TYPE TABLE OF ty_table,
ls_table TYPE ty_table.
SELECT carrid SUM( price ) AS price
INTO CORRESPONDING FIELDS OF TABLE lt_table
FROM sflight
GROUP BY carrid.
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid, ls_table-price.
ENDLOOP.
ABAP여러 개의 집계 함수도 함께 사용할 수 있다.
TYPES: BEGIN OF ty_table,
carrid LIKE sflight-carrid,
sum LIKE sflight-price,
avg LIKE sflight-price,
min LIKE sflight-price,
max LIKE sflight-price,
END OF ty_table.
DATA: lt_table TYPE TABLE OF ty_table,
ls_table TYPE ty_table.
SELECT carrid
SUM( price ) AS sum
AVG( price ) AS avg
MIN( price ) AS min
MAX( price ) AS max
INTO CORRESPONDING FIELDS OF TABLE lt_table
FROM sflight
GROUP BY carrid.
WRITE: /(20)'carrid',
(20)'sum',
(20)'avg',
(20)'min',
(20)'max'.
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid UNDER 'carrid',
ls_table-sum UNDER 'sum',
ls_table-avg UNDER 'avg',
ls_table-min UNDER 'min',
ls_table-max UNDER 'max'.
ENDLOOP.
ABAPHAVING
HAVING 절은 GROUP BY 절로 출력 될 결과에 조건을 지정할 때 사용 된다. 예를 들어, price 의 min 값이 최소 500,00 이상인 데이터만 출력하고 싶을 때 등에 사용이 가능하다. (WHERE 은 계산 후의 값에 조건을 줄 수 없다.)
TYPES: BEGIN OF ty_table,
carrid LIKE sflight-carrid,
sum LIKE sflight-price,
avg LIKE sflight-price,
min LIKE sflight-price,
max LIKE sflight-price,
END OF ty_table.
DATA: lt_table TYPE TABLE OF ty_table,
ls_table TYPE ty_table.
SELECT carrid
SUM( price ) AS sum
AVG( price ) AS avg
MIN( price ) AS min
MAX( price ) AS max
INTO CORRESPONDING FIELDS OF TABLE lt_table
FROM sflight
GROUP BY carrid
HAVING MIN( price ) >= 500. "최소 500 이상의 price를 지닌 행만 출력
WRITE: /(20)'carrid',
(20)'sum',
(20)'avg',
(20)'min',
(20)'max'.
LOOP AT lt_table INTO ls_table.
WRITE: / ls_table-carrid UNDER 'carrid',
ls_table-sum UNDER 'sum',
ls_table-avg UNDER 'avg',
ls_table-min UNDER 'min',
ls_table-max UNDER 'max'.
ENDLOOP.
ABAP