MYSQL 매출, 재고등 조회시 첫 행에 전월(이월) 합계 표시하려면 어떻게 해야 할까요? 3

by 신월동연산군 [2022.07.13 09:50:34]


단순하게 매입매출테이블을 예로 들겠습니다.

컬럼1  PK(auto_increase)

컬럼1 구분(1:매입,2:매출)

컬럼2  일자

컬럼3 금액

컬럼4 거래처명

위와같이 테이블 설계를 하고 검색은 시작일자 종료일자 두가지 조건으로 검색합니다. 

이때 첫번째행에  매입은 - 매출은 +로  계산하여 전월의 합계를 넣으려고합니다.

SELECT '이월금액' AS '구분', '' AS 일자,SUM(IF(구분 = '1', -금액,금액)), '' 거래처명

FROM 매입매출

WHERE 일자 < 검색시작일자 

UNION

SELECT 구분, 일자, 금액, 거래처명

FROM 매입매출

WHERE 일자 BETWEEN 검색시작일자 AND 검색종료일자; 

현재 생각나는 방법은 UNION을 사용하여 위와 같이 짜는것 밖에 생각이 나지않아 질문드립니다.

다르게 조회가능한 방법이 있을까요?? 

 

 

 

 

 

by 마농 [2022.07.13 10:32:07]

1. UNION 이 아닌 UNION ALL 이 맞습니다. 
 - 만약 같은 거래처에 같은날 같은 금액으로 거래가 발생하는 경우 중복이 제거되어 결과가 누락되게 됩니다.
 - 의미상, 성능상 UNION ALL 이 맞습니다.
2. 금액
 - 상단 쿼리에서 구분에 따라 +/- 로 나누었다면?
 - 하단 쿼리에서도 똑같이 적용해 줘야 하지 않나요?
3. 개선
 - 간단하게는 UNION ALL 을 이용하시면 됩니다.(단, 위 1,2 번 사항 고려)
 - 아래와 같이 테이블을 한번만 읽도록 개선 가능합니다.
 

SELECT 구분
     , 일자
     , 거래처명
     , SUM(금액) 금액
  FROM (SELECT CASE WHEN 일자 >= :검색시작일자 THEN 구분 ELSE '이월금액' END 구분
             , CASE WHEN 일자 >= :검색시작일자 THEN pk       END pk
             , CASE WHEN 일자 >= :검색시작일자 THEN 일자     END 일자
             , CASE WHEN 일자 >= :검색시작일자 THEN 거래처명 END 거래처명
             , CASE WHEN 구분 = '1' THEN -금액 ELSE 금액     END 금액
          FROM 매입매출
         WHERE 일자 <= :검색종료일자
        ) a
 GROUP BY 일자, pk, 구분, 거래처명
;

 


by 신월동연산군 [2022.07.13 13:43:28]

답변 감사합니다. 

말씀해주신 대로 쿼리를 짜도 제가 원하는대로 적용이 되네요. 

금액에 대해서는 제 설명이 부족했던 것 같습니다.

실제 보여주고싶은 내용은 금액과 잔액을 같이 표시하려고 합니다. 

그래서 +/-는 잔액표시컬럼에 적용하려고 하였습니다.

잔액계산은 아래와 같이 하려는데 개선해야될 부분이 있나요?

SELECT 구분
     , 일자
     , 거래처명
     ,ABS(SUM(금액)) 금액
     , SUM(금액) OVER (ORDER BY `pk`) AS 잔액
  FROM (SELECT CASE WHEN 일자 >= :검색시작일자 THEN 구분 ELSE '이월금액' END 구분
             , CASE WHEN 일자 >= :검색시작일자 THEN pk       END pk
             , CASE WHEN 일자 >= :검색시작일자 THEN 일자     END 일자
             , CASE WHEN 일자 >= :검색시작일자 THEN 거래처명 END 거래처명  
             , CASE WHEN 구분 = '1' THEN -금액 ELSE 금액     END 금액
          FROM 매입매출
         WHERE 일자 <= :검색종료일자
        ) a
 GROUP BY 일자, pk, 구분, 거래처명
;

by 마농 [2022.07.13 14:14:26]

1. "ABS(SUM(금액)) 금액" 부분의 의미가 모호합니다.
 - 이월금액이 마이너스가 나는 경우가 없다면? 가능한 방법입니다.
 - 이월금액이 마이너스가 나는 경우가 있다면? 의미가 모호해 집니다.
2. 분석함수 누적합계 사용 부분은
 - 오류 : SUM(금액) OVER (ORDER BY `pk`) AS 잔액
 - 수정 : SUM(SUM(금액)) OVER(ORDER BY 일자, pk) 잔액

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