본문 바로가기
카테고리 없음

ABAP New Syntax #12 - LOOP AT ~ GROUP BY

by SAPortal 2024. 3. 7.

목차

    1. LOOP AT ~ GROUP BY 란?

    LOOP AT ... GROUP BY 구문을 사용하면 내부 테이블의 데이터를 특정 기준에 따라 그룹화하고, 각 그룹에 대해 반복 처리를 수행할 수 있습니다.

    이 기능은 복잡한 데이터 집합을 다룰 때 매우 유용며 기존의 AT NEW, AT END OF 의 기능을 대체할 수 있습니다

     

    2. LOOP AT ~ GROUP BY 예제

    예제1) 기본문법

    DATA : LT_SFLIGHT TYPE TABLE OF SFLIGHT,
           LS_SFLIGHT TYPE SFLIGHT.
    
    DATA : BEGIN OF GT_SUM OCCURS 0,
           CARRID LIKE SFLIGHT-CARRID,
           PRICE  LIKE SFLIGHT-PRICE,
           END OF GT_SUM.
    
    DATA : LV_PRICE LIKE SFLIGHT-PRICE.
    
    SELECT *
      FROM SFLIGHT
      INTO TABLE @LT_SFLIGHT.
    
    SORT LT_SFLIGHT BY CARRID.
    LOOP AT LT_SFLIGHT INTO LS_SFLIGHT.
      AT NEW CARRID.
        CLEAR : LV_PRICE.
      ENDAT.
    
      LV_PRICE = LV_PRICE + LS_SFLIGHT-PRICE.
    
      AT END OF CARRID.
        GT_SUM-CARRID = LS_SFLIGHT-CARRID.
        GT_SUM-PRICE  = LV_PRICE.
        APPEND GT_SUM.
      ENDAT.
    ENDLOOP.

    위 예제는 CARRID기준으로 PRICE 총합을 구하는 예제입니다.

    CARRID가 동일한경우에는 계속 집계를 하다가 AT END OF CARRID시점에 집계한 DATA를 APPEND 하는 방식입니다.

    아래 예제에서는 위 로직을 LOOP AT ~ GROUP BY를 사용해서 적용해 보겠습니다.

     

    DATA : LT_SFLIGHT TYPE TABLE OF SFLIGHT.
    
    DATA : BEGIN OF GT_SUM OCCURS 0,
             CARRID LIKE SFLIGHT-CARRID,
             PRICE  LIKE SFLIGHT-PRICE,
           END OF GT_SUM.
    
    DATA : LV_PRICE LIKE SFLIGHT-PRICE.
    
    SELECT *
      FROM SFLIGHT
      INTO TABLE @LT_SFLIGHT.
      
    LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT) GROUP BY ( CARRID = LS_SFLIGHT-CARRID ) INTO DATA(LT_GROUP).
      CLEAR : LV_PRICE.
    
      LOOP AT GROUP LT_GROUP INTO DATA(LS_GROUP).
        LV_PRICE = LV_PRICE + LS_GROUP-PRICE.
      ENDLOOP.
    
      GT_SUM-CARRID = LT_GROUP-CARRID.
      GT_SUM-PRICE  = LV_PRICE.
      APPEND GT_SUM.
    ENDLOOP.

    LOOP AT 다음에 보시면 GROUP BY문이 보입니다.

    GROUP BY 다음에는 어떤기준으로 GROUPING을 할지 적어줍니다.

    위 예제에서는 CARRID기준으로 GROUPING을 하고 그 값이 LT_GROUP에 적용됩니다.

    LT_SFLIGHT의 DATA중 CARRID기준으로 10건이라고 하면 LT_GROUP으로 10번 LOOP을 돌게 됩니다.

     

     

    예제2) REDUCE문에서의 활용

    DATA : LT_SFLIGHT TYPE TABLE OF SFLIGHT.
    
    DATA : BEGIN OF GT_SUM OCCURS 0,
             CARRID LIKE SFLIGHT-CARRID,
             PRICE  LIKE SFLIGHT-PRICE,
           END OF GT_SUM.
    
    DATA : LV_PRICE LIKE SFLIGHT-PRICE.
    
    SELECT *
      FROM SFLIGHT
      INTO TABLE @LT_SFLIGHT.
      
    LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT) GROUP BY ( CARRID = LS_SFLIGHT-CARRID ) INTO DATA(LT_GROUP).
    
      LV_PRICE = REDUCE #( INIT SUM = 0 FOR WA IN GROUP LT_GROUP
                           NEXT SUM = SUM + WA-PRICE ).
    
      GT_SUM-CARRID = LT_GROUP-CARRID.
      GT_SUM-PRICE  = LV_PRICE.
      APPEND GT_SUM.
    ENDLOOP.

    기존예제에서 PRICE집계를 REDUCE문을 사용하는 로직으로 바꾸어 보았습니다.

    REDUCE구문을 보시면 FOR ~IN 뒤에 GROUP이라는 키워드가 추가된걸 볼수 있습니다.

    LOOP AT ~ GROUP BY로 GROUPING된 LT_GROUP로 REDUCE문을 사용하기 위해서는 IN GROUP LT_GROUP처럼 IN 다음에 GROUP이라는 문장을 추가하여 사용하시면 됩니다.

    어떤가요? 최초 AT NEW, AT END OF 를 사용했던 로직에 비해서 한결 로직이 간결해 졌습니다.

     

     

    예제3) 기타

    LOOP AT LT_SFLIGHT INTO DATA(LS_SFLIGHT) GROUP BY ( CARRID = LS_SFLIGHT-CARRID
                                                        CONNID = LS_SFLIGHT-CONNID ) INTO DATA(LT_GROUP).
    
    ENDLOOP.

    GROUPING의 기준이 여러개라면 위와같이 추가해 주시면 됩니다.

     

    3. LOOP AT ~ GROUP BY 장점

    1) 데이터 집계 및 분석의 간소화

    LOOP AT ... GROUP BY를 사용하면 복잡한 데이터 집합을 쉽게 그룹화하고, 그룹별로 집계(예: 합계, 평균, 카운트 등)를 수행할 수 있습니다.

    이는 데이터 분석 및 보고서 생성 시 간결하고 효율적인 코드 작성을 가능하게 합니다.

     

    2) 가독성 및 유지보수성 향상

    데이터를 그룹화하고 처리하는 로직을 명확하게 구조화함으로써 코드의 가독성이 향상됩니다.

    LOOP AT ... GROUP BY 구문은 데이터 처리 과정을 직관적으로 이해할 수 있게 하며, 이로 인해 코드의 유지보수성도 높아집니다.

     

    3) 성능 최적화

    내부 테이블의 데이터를 메모리 내에서 직접 그룹화하고 처리할 수 있기 때문에, 별도의 정렬이나 집계를 위한 임시 데이터 구조를 생성할 필요가 없습니다.

    이는 전체적인 처리 성능을 최적화하는 데 도움이 됩니다.