금액 불러오는 쿼리 질문이요..!! 0 8 1,887

by 압티 [2013.06.10 08:40:48]



금액 관련 테이블은 입니다.

품목 | 금액 | 적용일
사과 | 2000 | 2013-01-01
사과 | 3000 | 2013-02-01
키위 | 2000 | 2013-01-01
키위 | 4000 | 2013-02-01

매출 관련 테이블은
성명 | 구입일   | 품목
A  | 2013-06-05 | 사과
A  | 2013-06-05 | 키위
B  | 2013-01-03 | 사과
B  | 2013-01-03 | 키위

보고 싶은 내용은
성명 | 구입일    | 품목 | 금액
A  | 2013-06-05 | 사과 | 3000
A  | 2013-06-05 | 키위 | 4000
B  | 2013-01-03 | 사과 | 2000
B  | 2013-01-03 | 키위 | 2000

매출일자 기준으로 가격을 가져와서 보고싶은데 어떻게 해야하나요?
by 디케이 [2013.06.10 09:00:53]
 
WITH t1("품목", "금액", "적용일") AS
(     SELECT '사과', '2000', '2013-01-01' FROM dual
UNION ALL SELECT '사과', '3000', '2013-02-01' FROM dual
UNION ALL SELECT '키위', '2000', '2013-01-01' FROM dual
UNION ALL SELECT '키위', '4000', '2013-02-01' FROM dual
)
,t2("성명", "구입일", "품목") AS
(     SELECT 'A', '2013-06-05', '사과' FROM dual
UNION ALL SELECT 'A', '2013-06-05', '키위' FROM dual
UNION ALL SELECT 'B', '2013-01-03', '사과' FROM dual
UNION ALL SELECT 'B', '2013-01-03', '키위' FROM dual
)

SELECT t2.*
   , (SELECT MIN(금액) KEEP (DENSE_RANK LAST ORDER BY 적용일) FROM t1 WHERE t1.품목 = t2.품목 AND t1.적용일 <= t2.구입일) "금액"
 FROM t2

by 아발란체 [2013.06.10 09:19:44]
WITH MT(PRD, PRI, APY) AS (
  SELECT '사과', 2000, '2013-01-01' FROM DUAL UNION ALL
  SELECT '사과', 3000, '2013-02-01' FROM DUAL UNION ALL
  SELECT '키위', 2000, '2013-01-01' FROM DUAL UNION ALL
  SELECT '키위', 4000, '2013-02-01' FROM DUAL
), TT(NM, ORD, PRD) AS (
  SELECT 'A', '2013-06-05', '사과' FROM DUAL UNION ALL
  SELECT 'A', '2013-06-05', '키위' FROM DUAL UNION ALL
  SELECT 'B', '2013-01-03', '사과' FROM DUAL UNION ALL
  SELECT 'B', '2013-01-03', '키위' FROM DUAL 
)
SELECT
  TT.NM, TT.PRD, TT.ORD, MAX(PRI)
FROM
  MT, TT
WHERE
  MT.PRD(+) = TT.PRD
  AND MT.APY(+) <= TT.ORD
GROUP BY
  TT.NM, TT.PRD, TT.ORD
ORDER BY
  TT.NM 

by 아린 [2013.06.10 09:49:25]
MAX(PRI) 로만 하신다면

MT 테이블의 사과값이(01/01) 4,000 일경우 

이후 데이터들은 가장 큰값인 4,000 원으로 나올것 같습니다.

by 아발란체 [2013.06.10 11:19:16]

아린 // 아 그러네요, 감사합니다! ㅋ


by 아발란체 [2013.06.10 11:34:35]
--다시 작성합니다.
--디케이님과 다른 방법으로 해볼려고 했는데 생각보다 어렵네요. ㅋㅋ
--아무튼 저라면 디케이님거 쓰겠습니다.
WITH TT(PRD, PRI, APY) AS (
 SELECT '사과', 2000, '2013-01-01' FROM DUAL UNION ALL
 SELECT '사과', 3000, '2013-02-01' FROM DUAL UNION ALL
 SELECT '키위', 2000, '2013-01-01' FROM DUAL UNION ALL
 SELECT '키위', 4000, '2013-02-01' FROM DUAL
), MT(NM, ORD, PRD) AS (
 SELECT 'A', '2013-06-05', '사과' FROM DUAL UNION ALL
 SELECT 'A', '2013-06-05', '키위' FROM DUAL UNION ALL
 SELECT 'B', '2013-01-03', '사과' FROM DUAL UNION ALL
 SELECT 'B', '2013-01-03', '키위' FROM DUAL 
)
SELECT * FROM (
 SELECT
 MT.*,
 DECODE(MAX(APY) OVER(PARTITION BY NM, TT.PRD ORDER BY APY DESC), APY, PRI, 0) AS MDT
 FROM
 MT
 LEFT OUTER JOIN
 TT
 ON
 (MT.PRD = TT.PRD AND TT.APY <= MT.ORD)
)
WHERE NVL(MDT, 1) != 0
 

by 야신 [2013.06.10 09:35:28]
매출 테이블의 데이타를 일별, 품목별로 그룹핑하여 합한다음 아발란체님의 쿼리를 적용하시면 될듯 합니다

by 야신 [2013.06.10 11:34:51]
보다 보니 질문이 조금 이상한 듯 하네요.

금액 관련 테이블은 품목 | 금액 | 적용일  => 품목 | (판매단가 or 판매액)| 적용일 
매출 관련 테이블은 성명 | 구입일   | 품목  => 성명 | 판매일 | 품목

어느것이 맞는 것인지...? 판매단가냐 판매금액 이냐에 따라 sum 이냐 min 이냐 함수가 다르게 쓰일듯한데요.

by 손님 [2013.06.12 09:21:02]
디케이님, 아발란체님 :  감사합니다. ^^

야신님 : 테이블을 약간 알기 쉽도록 이름을 붙인거라서 MIN값으로 처리하면 제대로 된 값이 나옵니다.^^
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입