초짜쿼리질문합니다.. 0 4 915

by 초짜 [SQL Query] [2009.12.01 09:35:21]


ex) A테이블에    2008 김과장 100
                            2008 박부장    70
                            2008 이주임    80

B테이블에        2009 김과장   60
                           2009 황차장  100
                           2009 이주임   50
                          2009 왕고참   100

이상태에서    2009 김과장 100 - 60
                        2009 박부장  70 -0
                        2009 황차장   0  - 100
                        2009 이주임  80-50
                       2009 왕고참   0-100

이런형태를 구하고 싶습니다.
# A테이블의 갯수가 더많을수도 있고 B테이블의 갯수가 더많을수도 있습니다. <--요부분이 젤걸립니다.
년도부분 추가 하였습니다...

고수님들의 지도 부탁드립니다. ^^;;

 

      

  

by 이재현 [2009.12.01 10:40:13]
쪼렙입니다.

생각을 많이하게하는 문제군요..

WITH TB_A AS (
SELECT '김과장' AS NAME, '100' AS AMT FROM DUAL
UNION ALL SELECT '박부장' AS NAME, '70' AS AMT FROM DUAL
UNION ALL SELECT '이주임' AS NAME, '80' AS AMT FROM DUAL
),
TB_B AS(
SELECT '김과장' AS NAME, '60' AS AMT FROM DUAL
UNION ALL SELECT '황차장' AS NAME, '100' AS AMT FROM DUAL
UNION ALL SELECT '이주임' AS NAME, '50' AS AMT FROM DUAL
UNION ALL SELECT '왕고참' AS NAME, '100' AS AMT FROM DUAL
)
SELECT NAME, NVL(SUM(AMT_1),0) ||'-'||NVL(SUM(AMT_2),0)
FROM (
SELECT NAME, AMT AS AMT_1, '' AS AMT_2 FROM TB_A
UNION ALL
SELECT NAME, '' AS AMT_1, AMT AS AMT_2 FROM TB_B
)
GROUP BY NAME
ORDER BY 1

by 초짜 [2009.12.01 11:15:08]
이재현님 답변 감사합니다.. 제가질문 할때 조건을 몇게 빼먹은거 같습니다..
그래도 도움주셔서 감사합니다.

by finecomp [2009.12.01 14:33:11]
금액을 숫자라고 가정하면,
SELECT MAX(연도), 이름, SUM(금액A) || '-' || SUM(금액B)
FROM
(
SELECT 연도, 이름, 금액 금액A, 0 금액B FROM A
UNION ALL
SELECT 연도, 이름, 0 금액A, 금액 금액B FROM B
)
GROUP BY 이름

금액A, 금액B의 없는 쪽 데이터를 TO_NUMBER(''), 0 또는 ''로 만들어낼 때 원래의 컬럼type과 맞게 UNION ALL해야 합니다...안그러면 type mismatch 오류가 날 겁니다.
주의하세요~~

by finecomp [2009.12.01 14:36:44]
어랏 박부장이 2009네요...;
그러면 MAX(연도)가 아니군요...
입력받는 연도등을 이용해서 '2009' 로 바꾸세요..;
e.g. SUBSTR(:입력일자, 1, 4) AS 연도
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입