안녕하세요 포인트 사용내역을 같은 날짜로 묶으려고 합니다.
포인트를 사용할 수 있는 곳은 자전거, 물건구매입니다.
자전거포인트사용 테이블은 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
감사합니다 :)
사용하신 구문 중 알리아스를 이용한 그룹바이 구문은 표준 구문이 아닙니다.
- 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 ;