SELECT X.idx , X.name , Y.pay_date -- 계약금입금일 , Y.pay_date2 -- 중도금입금일 , Y.pay_date3 -- 잔금입금일 FROM default_info X LEFT JOIN pay_info Y ON X.idx = Y.idx WHERE Y.idx <> '' AND ( Y.pay_date BETWEEN '2019-03-01' and '2019-03-31' OR Y.pay_date2 BETWEEN '2019-03-01' and '2019-03-31' OR Y.pay_date3 BETWEEN '2019-03-01' and '2019-03-31' ) ORDER BY CAST(X.idx2 AS SIGNED) DESC, X.idx DESC
안녕하세요. 항상 이곳에서 도움만 받는사람입니다.
오늘도 도움을 받고자 이렇게 글을 적네요.
다름이 아니라 현재 회사 인트라넷을 하나 만들고 있는데요.
저희 물건을 구매한 고객들의 계약금, 중도금, 잔금등의 입금일을 처리하고있는데, 검색기능에 막히는 부분이 있어 도움을 얻고자 합니다.
위와같은 쿼리문을 하나 만들었는데요.
default_info : 고객정보테이블
pay_info : 금액입금테이블
저번달 그러니깐 3월1일부터 3월31일까지의 계약금입금일, 중도금입금일, 잔금입금일 내역을 보고싶은데 어떻게 구현을 해야될지 막막하네요.
고수님들의 도움좀 부탁드립니다.
1. 질문을 명확하게 해주세요.
- 원질문에 이런 내용은 전혀 표현 안하셨네요.
- 원하는 내용을 명확하게 표현해 주세요.
2. 합계의 의미가 뭔가요?
- 금액 합계인가요?
- 그러려면 금액 항목도 3개로 나뉘어 있겠네요?
3. 정규화 관련
- 비슷한 속성의 값들을 컬럼으로 나열하는 것은 정규화 위배입니다.
- 3개 컬럼의 값을 한개 컬럼에 3개 레코드로 분리해야 합니다.
- 대신 구분컬럼이 하나 추가됩니다.
자료 예시
기존 : (1, '2019-03-01', '2019-03-02', '2019-03-03')
변경 :
(1, '계약금', '2019-03-01')
(1, '중도금', '2019-03-02')
(1, '잔금', '2019-03-03')
-- 1. 비정규화 상태에서의 쿼리 -- SELECT x.idx , x.name , SUM(CASE WHEN y.pay_date BETWEEN '2019-03-01' AND '2019-03-31' THEN pay_amt END) pay_amt -- 계약금 , SUM(CASE WHEN y.pay_date2 BETWEEN '2019-03-01' AND '2019-03-31' THEN pay_amt2 END) pay_amt2 -- 중도금 , SUM(CASE WHEN y.pay_date3 BETWEEN '2019-03-01' AND '2019-03-31' THEN pay_amt3 END) pay_amt3 -- 잔금 FROM default_info x LEFT JOIN pay_info y ON x.idx = y.idx WHERE y.idx <> '' AND ( y.pay_date BETWEEN '2019-03-01' AND '2019-03-31' OR y.pay_date2 BETWEEN '2019-03-01' AND '2019-03-31' OR y.pay_date3 BETWEEN '2019-03-01' AND '2019-03-31' ) GROUP BY x.idx2, x.idx, x.name ORDER BY CAST(x.idx2 AS SIGNED) DESC, x.idx DESC ; -- 2. 정규화 상태에서의 쿼리 -- SELECT x.idx , x.name , SUM(CASE WHEN y.pay_gubun = '1' THEN pay_amt END) pay_amt1 , SUM(CASE WHEN y.pay_gubun = '2' THEN pay_amt END) pay_amt2 , SUM(CASE WHEN y.pay_gubun = '3' THEN pay_amt END) pay_amt3 FROM default_info x LEFT JOIN pay_info y ON x.idx = y.idx WHERE y.idx <> '' AND y.pay_date BETWEEN '2019-03-01' AND '2019-03-31' GROUP BY x.idx2, x.idx, x.name ORDER BY CAST(x.idx2 AS SIGNED) DESC, x.idx DESC ;