gwapo
gwapo

Reputation: 208

Group an internal table by multiple fields?

I have an internal table consisting the ff structure.

 SO   Customer  Materialno  Materialgroup2  Liters
 001  James     1           GroupA          5
 001  James     2           GroupA          10
 001  James     3           GroupB          20
 002  John      2           GroupA          10
 002  John      3           GroupA          10
 002  John      4           GroupB          20
 002  John      5           GroupB          5

​ I need to add it by customer, billing doc, and by their material group2. ​Now the final output of the internal table should be like this.

SO   Customer  MaterialGroup2  Liters
001  James     GroupA          15
001  James     GroupB          20
002  John      GroupA          20
002  John      GroupB          25

Upvotes: 0

Views: 2140

Answers (2)

Florian
Florian

Reputation: 5051

rt_result = VALUE #( FOR GROUPS group OF ls_source IN it_source
                     GROUP BY ( so             = ls_source-so
                                customer       = ls_source-customer
                                material_group = ls_source-material_group )
                     ( so             = group-so
                       customer       = group-customer
                       material_group = group-material_group
                       liters         = REDUCE #( INIT lv_liters = 0
                                                  FOR ls_member IN GROUP group
                                                  NEXT lv_liters = lv_liters + ls_member-liters ) ) ).

Upvotes: 2

Binh
Binh

Reputation: 241

REPORT ztest.

TYPES:
  BEGIN OF ts_input,
    so            TYPE char3,
    customer      TYPE char5,
    materialno    TYPE i,
    materialgroup TYPE char6,
    liters        TYPE i,
  END OF ts_input,

  BEGIN OF ts_output,
    so            TYPE char3,
    customer      TYPE char5,
    materialgroup TYPE char6,
    liters        TYPE i,
  END OF ts_output.

DATA:
  lv_liters TYPE i,

  gt_input  TYPE STANDARD TABLE OF ts_input,
  gs_input  TYPE ts_input,
  gt_temp   TYPE STANDARD TABLE OF ts_output,
  gs_temp   TYPE ts_output,
  gt_output TYPE STANDARD TABLE OF ts_output,
  gs_output TYPE ts_output.

START-OF-SELECTION.
  gs_input-so            = '001'.
  gs_input-customer      = 'james'.
  gs_input-materialno    = 1.
  gs_input-materialgroup = 'GroupA'.
  gs_input-liters        = 5.
  APPEND gs_input TO gt_input.
  gs_input-so            = '001'.
  gs_input-customer      = 'james'.
  gs_input-materialno    = 2.
  gs_input-materialgroup = 'GroupA'.
  gs_input-liters        = 10.
  APPEND gs_input TO gt_input.
  gs_input-so            = '001'.
  gs_input-customer      = 'james'.
  gs_input-materialno    = 3.
  gs_input-materialgroup = 'GroupB'.
  gs_input-liters        = 20.
  APPEND gs_input TO gt_input.

  gs_input-so            = '002'.
  gs_input-customer      = 'john'.
  gs_input-materialno    = 2.
  gs_input-materialgroup = 'GroupA'.
  gs_input-liters        = 10.
  APPEND gs_input TO gt_input.
  gs_input-so            = '002'.
  gs_input-customer      = 'john'.
  gs_input-materialno    = 3.
  gs_input-materialgroup = 'GroupA'.
  gs_input-liters        = 10.
  APPEND gs_input TO gt_input.
  gs_input-so            = '002'.
  gs_input-customer      = 'john'.
  gs_input-materialno    = 4.
  gs_input-materialgroup = 'GroupB'.
  gs_input-liters        = 20.
  APPEND gs_input TO gt_input.
  gs_input-so            = '002'.
  gs_input-customer      = 'john'.
  gs_input-materialno    = 5.
  gs_input-materialgroup = 'GroupB'.
  gs_input-liters        = 5.
  APPEND gs_input TO gt_input.

  " move to temp. table, skip MaterialNo
  LOOP AT gt_input INTO gs_input.
    gs_temp-so            = gs_input-so.
    gs_temp-customer      = gs_input-customer.
    gs_temp-materialgroup = gs_input-materialgroup.
    gs_temp-liters        = gs_input-liters.
    APPEND gs_temp TO gt_temp.
  ENDLOOP.


  SORT gt_temp ASCENDING BY so customer materialgroup.

  LOOP AT gt_temp INTO gs_temp.
    AT NEW materialgroup.
      CLEAR lv_liters.
    ENDAT.

    lv_liters = lv_liters + gs_temp-liters.

    AT END OF materialgroup.
      gs_output-so            = gs_temp-so.
      gs_output-customer      = gs_temp-customer.
      gs_output-materialgroup = gs_temp-materialgroup.
      gs_output-liters        = lv_liters.
      APPEND gs_output TO gt_output.
    ENDAT.

  ENDLOOP.

Upvotes: 1

Related Questions