LEFT JOIN 과 RIGHT JOIN의 활용 0 2 790

by 핏슈 [MySQL] MySQL JOIN [2022.04.07 12:13:44]


결과값.png (96,433Bytes)

안녕하세요 포인트 사용내역을 같은 날짜로 묶으려고 합니다.

포인트를 사용할 수 있는 곳은 자전거, 물건구매입니다.

자전거포인트사용 테이블은  tb_bike_pay, 물건구매포인트 사용 테이블은 tb_big_pay입니다.

사용한 내역을 같은 날로 묶어서 조회하려고 하는데 mySQL은 FULL OUTER JOIN 이 없어서 

LEFT와 RIGHT를 모두 사용했습니다.

그러다보니 쿼리문이 길어져서 더 간결한 방법이 없을까 질문드립니다.

(bk_pointchk_dttm과 bg_pointchk_dttm은 자료형이 TIMESTAMP라 년/월/일로 구분하고자 LEFT를 사용했습니다)

(GROUP BY와 SUM(point)는 테이블별 동일날에 결제된 금액을 더하기위해 사용했습니다.)

 

		SELECT
			ROW_NUMBER() OVER(ORDER BY payDttm)	ROWNUM
			,SUB.*
		FROM
		(
			SELECT
			A.payDttm
			, bikePrice
			, bigPrice
			FROM
				(
				SELECT
					LEFT(bk_pointchk_dttm,11) 	payDttm
					,SUM(bk_rtn_point)		  	bikePrice
				FROM
				tb_bike_pay
				GROUP BY payDttm
				)A
			LEFT JOIN
				(
				SELECT
					LEFT(bg_pointchk_dttm,11) 	payDttm
					, SUM(bg_rtn_point) 		bigPrice
				FROM
				tb_big_pay
				GROUP BY payDttm
				)B
				ON A.payDttm=B.payDttm
		UNION
			SELECT
			B.payDttm
			, bikePrice
			, bigPrice
			FROM
				(
				SELECT
					LEFT(bk_pointchk_dttm,11)   payDttm
					,SUM(bk_rtn_point) 		    bikePrice
				FROM
				tb_bike_pay
				GROUP BY payDttm
				)A
				RIGHT JOIN
				(
				SELECT
					LEFT(bg_pointchk_dttm,11)   payDttm
					, SUM(bg_rtn_point) 	    bigPrice
				FROM
				tb_big_pay
				GROUP BY payDttm
				)B
				ON A.payDttm=B.payDttm
			)SUB
		WHERE 1=1

감사합니다 :)

 

by 마농 [2022.04.07 14:14:13]

사용하신 구문 중 알리아스를 이용한 그룹바이 구문은 표준 구문이 아닙니다.
- GROUP BY payDttm  -- 비표준(MySQL 에서만 정상 동작 / 타 DB 에서는 오류)
- GROUP BY LEFT(bk_pointchk_dttm, 11)  -- 표준 구문 사용을 권장합니다.
 

SELECT ROW_NUMBER() OVER(ORDER BY payDttm) rn
     , payDttm
     , SUM(bk_rtn_point) bk_rtn_point
     , SUM(bg_rtn_point) bg_rtn_point
  FROM (SELECT LEFT(bk_pointchk_dttm, 11) payDttm
             , bk_rtn_point
             , 0 bg_rtn_point
          FROM tb_bike_pay
         UNION ALL
        SELECT LEFT(bg_pointchk_dttm, 11) payDttm
             , 0 bk_rtn_point
             , bg_rtn_point
          FROM tb_big_pay
        ) a
 GROUP BY payDttm
;

 


by 핏슈 [2022.04.07 15:10:26]

감사합니다 :) 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입