본문 바로가기
ABAP

간단한 SQL 실습 2

by clode 2023. 1. 24.
728x90
반응형

실습 1

Inner join, 데이터 10건만

Inner join은 여러 테이블이 동일한 키를 가지고 있을때 키값을 연결시켜 여러 테이블의 필드를 하나의 쿼리에서 사용할 수 있도록 한다.

  • inner join ~ on 구문을 사용한다.
  • AS : Aliasing의 약자로 테이블 별칭. 어떤 테이블 필드를 return할지 SELECT 절 이후 명시해야한다.
  • ON : JOIN하게될 테이블 KEY 필드의 조건을 명시한다.

[프로그램 로직]

DATA:  BEGIN OF wa.
       INCLUDE STRUCTURE vbak.
DATA : posnr TYPE vbap-posnr,
       arktx TYPE vbap-arktx,
       END OF wa,
       gt_itab LIKE TABLE OF wa.

SELECT * FROM vbak AS a INNER JOIN vbap AS b
           ON a~vbeln = b~vbeln
         INTO CORRESPONDING FIELDS OF TABLE gt_itab UP TO 10 ROWS
        WHERE auart = 'ZOR'
          AND lifsk = '99'.

[실행화면]

 

실습 2

'AIR'가 포함된 데이터

[프로그램 로직]

data : gt_itab type TABLE OF scarr.

select * from scarr
      into CORRESPONDING FIELDS OF TABLE gt_itab
      where carrname LIKE '%Air%'.

[실행화면]

 

실습 3

for all entries

인터널테이블에 채워진값을 참조하는 명령문이다. 이 구문은 인터널테이블의 데이터가 모두 일치하는 경우 중복된 데이터는 제거하는 기능이 있어 사용시 주의해야 한다!

[프로그램 로직]

DATA : gt_mkpf TYPE TABLE OF mkpf,
         gt_itab TYPE TABLE OF mseg.

SELECT * FROM mkpf
    INTO CORRESPONDING FIELDS OF TABLE gt_mkpf
    WHERE usnam = '2005A11'. "내가 만든 자재

SELECT * FROM mseg
  into CORRESPONDING FIELDS OF TABLE gt_itab
  FOR ALL ENTRIES IN gt_mkpf
  WHERE mblnr = gt_mkpf-mblnr.

[실행화면]

 

실습 4

3개의 테이블 join

[프로그램 로직]

DATA:  BEGIN OF wa.
           INCLUDE STRUCTURE likp.
DATA : posnr TYPE lips-posnr,
           matnr TYPE lips-matnr,
           maktx TYPE makt-maktx,
           END OF wa,
           gt_itab LIKE TABLE OF wa.

select * from likp as a INNER JOIN lips as b
  on a~vbeln = b~vbeln
  INNER JOIN makt as c
  on b~matnr = c~matnr
  into CORRESPONDING FIELDS OF TABLE gt_itab
  WHERE  a~erdat BETWEEN '20200601' and '20200630'
  and a~ernam = '2005A11'
  and c~spras = sy-langu.

[실행화면]

 

실습 5

sum, avg, max, min / group by

합계, 평균, 최댓값, 최솟값을 구해보자. 이 명령문을 사용할 땐 group by로 합산해줄 필드명을 명시해야 한다.

[프로그램 로직]

DATA: BEGIN OF wa,
  carrid TYPE sflight-carrid,
  connid TYPE sflight-connid,
  paysum TYPE sflight-paymentsum,
  payavg TYPE sflight-paymentsum,
  paymax TYPE sflight-paymentsum,
  paymin TYPE sflight-paymentsum,
  END OF wa,
  gt_itab LIKE TABLE OF wa.


SELECT carrid connid
    SUM( paymentsum ) 
    AVG( paymentsum )
    MAX( paymentsum )
    MIN( paymentsum )
    INTO TABLE gt_itab
    FROM sflight
    WHERE carrid = 'AA'
    GROUP BY carrid connid.

동적선언은 괄호를 띄어쓰기 해주어야 한다.

=

SELECT carrid connid
    SUM( paymentsum ) as paysum
  AVG( paymentsum ) as payavg
  MAX( paymentsum ) as paymax
  MIN( paymentsum ) as paymin
    INTO CORRESPONDING FIELDS OF TABLE gt_itab
    FROM sflight
    WHERE carrid = 'AA'
    GROUP BY carrid connid.

CORRESPONDING 하려면 필드 이름을 맞춰줘야하기 때문에 별칭을 지정 해주어야 한다.

[실행화면]

 

실습 6

Left outer join

Left outer join은 조인문 왼쪽에 있는 테이블의 모든 결과를 가져온 후 오른쪽 테이블의 데이터를 매칭하며, 매칭되는 데이터가 없는 경우 NULL 매칭하는 명령문이다.

[프로그램 로직]

DATA: BEGIN OF wa,
  carrid TYPE scarr-carrid,
  carrname TYPE scarr-carrname,
  connid type spfli-connid,
  END OF wa,
  gt_itab like TABLE OF wa.


 SELECT a~carrid a~carrname b~connid  from scarr as a LEFT OUTER JOIN spfli as b
   ON a~carrid = b~carrid
   INTO CORRESPONDING FIELDS OF TABLE GT_ITAB
   WHERE a~carrid BETWEEN 'AA' and 'AZ'.

[실행화면]

 

실습 7

Max

[프로그램 로직]

DATA : wa LIKE zs1d11t_01,
  gt_itab LIKE TABLE OF wa,
 seqnrmax TYPE zs1d11t_01-seqnr.

SELECT * FROM zs1d11t_01
   INTO TABLE gt_itab.

SELECT MAX( seqnr ) INTO seqnrmax
  FROM zs1d11t_01.
READ TABLE gt_itab INTO wa  WITH KEY seqnr = seqnrmax.

IF seqnrmax = '99'. " 
    MESSAGE i016(pn) WITH  '더 이상 추가할 수 없습니다'. 

  ELSE.
    wa-seqnr = wa-seqnr + 1. 
    APPEND wa TO gt_itab.

   MODIFY zs1d11t_01  FROM TABLE gt_itab.

ENDIF.

최댓값을 가지는 변수명을 선언해 최댓값을 seqnrmax에 넣어준 뒤 그 값을 읽어 wa에 넣어준다.

*다른 방법

인터널테이블에 넣은 후 순번을 기준으로 내림차순 정렬하면 첫번째줄이 가장 큰값이 된다. 가장 큰값이 된 첫번째 줄을 읽어 wa에 담으면 된다.

DATA : wa LIKE zs1d11t_01,
         gt_itab LIKE TABLE OF wa,
           

SELECT * FROM zs1d11t_01
   INTO TABLE gt_itab.

 SORT gt_itab by seqnr DESCENDING.   
 READ TABLE gt_itab into wa INDEX 1. 

 IF
   wa-seqnr = '99'.

이하 로직은 동일하다.

[실행화면]

 

실습 8

subquerry, for all entries

[프로그램 로직]

1) SUBQUERRY

select문 안에 select 문이 있는 형태이다.
퍼포먼스 측면으로 보면 바람직하진 않은 구문이다.

DATA : BEGIN OF wa.
       INCLUDE STRUCTURE tvtw.
       DATA : vtext TYPE tvtwt-vtext,
       END OF wa,
       gt_itab LIKE TABLE OF wa,
       gt_itab2 LIKE TABLE OF wa.

SELECT * FROM tvtwt
   INTO CORRESPONDING FIELDS OF TABLE gt_itab
  WHERE vtweg
     IN ( SELECT vtweg FROM tvtw )
    AND spras = sy-langu.

2) FOR ALL ENTRIES

SELECT vtweg FROM tvtw
   INTO CORRESPONDING FIELDS OF TABLE gt_itab2.

SELECT mandt vtext vtweg FROM tvtwt
  INTO CORRESPONDING FIELDS OF TABLE gt_itab
   FOR ALL ENTRIES IN gt_itab2
 WHERE vtweg = gt_itab2-vtweg
   and spras = sy-langu.

[실행화면]

728x90
반응형

'ABAP' 카테고리의 다른 글

Subscreen  (2) 2023.01.24
Parameter, Select-options, Initialization  (0) 2023.01.24
간단한 SQL 실습  (0) 2023.01.24
Lock object  (0) 2023.01.24
Search help 생성 (SE11)  (0) 2023.01.24

댓글