300x250
728x90
# WITH문이란?
# WITH문은 공통 테이블 표현식( CTE, Common Table Expression )을 정의하는 사용이 된다.
* CTE( Common Table Expression )이란?
# 단일 문의 범위 내에 존재하고 나중에 해당 문 내에서 여러 번 참조될 수 있는 명명된 임시 결과 집합입니다.
(참고)
https://dev.mysql.com/doc/refman/8.0/en/with.html#common-table-expressions
* 사용하는 이유?
CTE는 쿼리의 가독성을 높이고, 복잡한 쿼리를 단순하게 작성할 수 있고, CTE로 정의한 부분을 여러 번 참조할 수 있어 코드 중복을 없앨 수 있다.
CTE의 이름은 최대 30자까지 가능하며, " + "으로 연결할 수 있다.
바로 넘어가 보자.
시작하기 전. ( 비밀번호 : GJWITH )
2024.05.14 - [.SAP/....ABAP 예제] - SAP WITH문 예제
# 다음과 같은 리스트가 나오게 하는 것이 목표다. ( 예제 테이블 참고 )
# LOOP문을 통해서 하는 방법, OUTER JOIN 해서 SUM 하는 방법, 인터널 테이블 두 개 만들어서 JOIN 하는 방법 등등.. 방법은 정말 많기 때문에 참고하는 정도로 넘어가면 될 것 같다.
# 또한 여기서는 복잡한 쿼리가 사용되지가 않기 때문에 WITH문을 굳이 써야 하나 할 수도 있지만, 위에서 언급했듯이 여러 가지 장점 때문에 사용하기도 한다. ( 사람 취향 )
01. 화면에 뿌려줄 인터널 테이블을 만들어보자.
# 여기서는 간단하게 SALV로 만드려고 하니 참고 바란다.
TYPES: BEGIN OF TY_S_LIST,
RESE TYPE ZDRSE_GJ,
RESE_T TYPE ZDRSET_GJ,
PRERESE_QUAN TYPE ZDPRERES_GJ,
RESE_QUAN TYPE ZDRES_GJ,
END OF TY_S_LIST .
DATA
GT_LIST TYPE TABLE OF TY_S_LIST.
# 02. WITH문 사용하기
# 01. 우선 기준이 되는 테이블 우선으로 SELECT을 하기 위해서 WITH문을 만들어보자. ( WITH 이름은 최대 30 자릿수 )
# 02. 기준이 되는 테이블을 SELECT 해서 WITH문 안에다 넣어보자.
# " +MAIN_RESER "이라는 인터널 테이블을 만들었다고 생각해 보자.
#03. 그다음 SUM 할 값이 있는 테이블을 WITH문 사용해서 만들어보자. ( WITH 이름은 최대 30 )
# Group by 예약번호 기준으로 SUM 값을 구하는 SQL이다.
#04. 이제 두 개의 View( 인터널 테이블)을 이용해서 마지막에 SELECT을 해보자.
# 위에서 하나하나 SELECT 했던 View( 이터널 테이블)을 사용해서 INNER JOIN을 통해 한번에 데이터를 보여주게 만드는 로직
TYPES: BEGIN OF TY_S_LIST,
RESE TYPE ZDRSE_GJ,
RESE_T TYPE ZDRSET_GJ,
PRERESE_QUAN TYPE ZDPRERES_GJ,
RESE_QUAN TYPE ZDRES_GJ,
END OF TY_S_LIST .
DATA
GT_LIST TYPE TABLE OF TY_S_LIST.
SELECT
a~rese,
a~rese_t,
a~prerese_quan,
SUM( rese_quan ) AS rese_quan
FROM ztreser_gj AS a
LEFT OUTER JOIN ztresquan_gj AS b
ON a~rese EQ b~rese
INTO TABLE @gt_list
GROUP BY a~rese, a~rese_t, a~prerese_quan.
"------------WITH---------------"
WITH
+MAIN_RESER AS (
SELECT
RESE,
RESE_T,
PRERESE_QUAN
FROM
ZTRESER_GJ
),
+SUM_RESE AS (
SELECT
RESE,
SUM( RESE_QUAN ) AS RESE_QUAN
FROM ZTRESQUAN_GJ
GROUP BY RESE
)
SELECT
A~RESE,
A~RESE_T,
A~PRERESE_QUAN,
B~RESE_QUAN
FROM +MAIN_RESER AS A
INNER JOIN +SUM_RESE AS B
ON A~RESE EQ B~RESE
INTO TABLE @GT_LIST.
SORT GT_LIST BY RESE.
*-------------------------------------*
DATA:
GR_SALV TYPE REF TO CL_SALV_TABLE.
DATA:
COLUMNS TYPE REF TO CL_SALV_COLUMNS_TABLE.
*-------------------------------------*
CL_SALV_TABLE=>FACTORY(
IMPORTING
R_SALV_TABLE = GR_SALV
CHANGING
T_TABLE = GT_LIST
).
COLUMNS = GR_SALV->GET_COLUMNS( ).
COLUMNS->SET_OPTIMIZE( ).
GR_SALV->DISPLAY( ).
*-------------------------------------*
# 03. 실행
WITH문 말고 다른 방법으로는..
SELECT
a~rese,
a~rese_t,
a~prerese_quan,
SUM( rese_quan ) AS rese_quan
FROM ztreser_gj AS a
LEFT OUTER JOIN ztresquan_gj AS b
ON a~rese EQ b~rese
INTO TABLE @gt_list
GROUP BY a~rese, a~rese_t, a~prerese_quan.
# 끝..
728x90
'.ABAP > ..모든 것' 카테고리의 다른 글
SAP Selection Screen SubScreen 설정 (2) | 2024.05.24 |
---|---|
SAP Subtotal Text(텍스트) 설정 (0) | 2024.05.16 |
SAP 문자열 체크하기( 전화번호, 사번 등) 정규표현식 사용 (0) | 2024.04.29 |
SAP Search Help 정리 (3) | 2024.04.23 |
ABAP Memory 조회 (0) | 2024.04.19 |