검색기능관련문의 0 5 530

by 날아라! [MySQL] [2019.04.01 12:30:25]


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일까지의 계약금입금일, 중도금입금일, 잔금입금일 내역을 보고싶은데 어떻게 구현을 해야될지 막막하네요.

고수님들의 도움좀 부탁드립니다.

 

 

by 마농 [2019.04.01 14:02:35]

뭐가 문제죠? 쿼리는 맞는 듯 한데요? 성능상 문제인가요?
OR 를 사용할 수 밖에 없는 쿼리네요.
pay_info 테이블의 구조를 아예 바꾸는건 어떤가요?
날짜1, 날짜2, 날짜3 식의 컬럼 형태가 아닌
구분, 날짜 식의 레코드 형태로 관리하세요.


by 날아라! [2019.04.01 14:15:42]

답변감사합니다.

구분, 날짜식의 레코드형태라면 어떤걸 의미하는건지요.?

질문내용중에 빠진내용이 있는듯 한데요.

정확하게 제가 노출시키고 싶은것은 3월달로 검색을 하게되면 계약금입금일의 3월달합계, 중도금입금일의 3월달합계, 잔금입금일의 3월달합계를 노출시키고싶은건데요.

막상 저렇게 하니, 예를 들어서 계약금입금일이 2월달이고, 중도금도 2월달인데 잔금입금일만 3월달이라고 한다면, 계약금입금일의 합계가 2월달까지 포함되어서 합계가 노출되기

때문입니다. ^^

답변감사합니다.


by 마농 [2019.04.01 14:45:43]

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')


by 날아라! [2019.04.01 14:54:47]

네...잘배웠습니다.^^


by 마농 [2019.04.01 16:25:18]
-- 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
;

 

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