안녕하세요 도저희 어떻게 쿼리를 짜야할지 몰라서 도움 요청드립니다.
예를 들어
bo라는 테이블에 2개의 컬럼이 있습니다.
bonumber | boname |
5989 | 포도 |
9365 | 포도 |
10327 | 바나나 |
4384 | 바나나 |
po라는 테이블에 3개의 컬럼이 있습니다.
poseq | ponumber | poname |
1 | 5989 | 포도즙 |
2 | 9365 | 포도주스 |
3 | 10327 | 바나나주스 |
4 | 4384 | 바나나우유 |
xo라는 테이블에는 2개 컬럼이 있습니다.
poseq | volume |
1 | 10 |
2 | 3 |
3 | 5 |
4 | null |
bo 테이블과 po 테이블과 xo 테이블을 조인하여
select distinct a.boname as 이름, sum(case when c.volume is null then 0 else c.volume end) as 구매수량 from bo a
left outer join po b on a.bonumber=b.ponumber
left outer join xo c on b.poseq=x.poseq
groupby boname
로하여 현재 결과가
이름 | 구매수량 |
포도 | 13 |
바나나 | 5 |
위와 같이 결과가 나왔습니다.
jo 테이블에는 2개의 컬럼이 있습니다. user 100이라는사람이 poseq 1인포도즙을 구매한것입니다.
poseq | user |
1 | 100 |
1 | 200 |
2 | 300 |
2 | 400 |
3 | 500 |
4 | 600 |
여기서 이제 제가 원하고자 하는 결과는
이름 | 구매수량 | 판매수량 |
포도 | 13 | 4 |
바나나 | 5 | 2 |
위와같은 결과가 나오는 판매수량입니다.
그래서 마지막으로 최종 결과는
이름 | 구매수량 | 판매수량 | 잔여수량 |
포도 | 13 | 4 | 9 |
바나나 | 5 | 2 | 3 |
도저희 쿼리를 짜보려고해도 어떻게 해야할지 몰라 문의 드립니다.
힌트라도 주시면 감사하겠습니다.
WITH BO(BONUMBER, BONAME) AS ( SELECT 5989, '포도' FROM DUAL UNION ALL SELECT 9365, '포도' FROM DUAL UNION ALL SELECT 10327, '바나나' FROM DUAL UNION ALL SELECT 4384, '바나나' FROM DUAL ) , PO (POSEQ, PONUMBER, PONAME) AS ( SELECT 1, 5989, '포도즙' FROM DUAL UNION ALL SELECT 2, 9365, '포도주스' FROM DUAL UNION ALL SELECT 3, 10327, '바나나주스' FROM DUAL UNION ALL SELECT 4, 4384, '바나나우유' FROM DUAL ) , XO(POSEQ, VOLUME) AS ( SELECT 1, 10 FROM DUAL UNION ALL SELECT 2, 3 FROM DUAL UNION ALL SELECT 3, 5 FROM DUAL UNION ALL SELECT 4, NULL FROM DUAL ) , JO(POSEQ, "user") AS( SELECT 1, 100 FROM DUAL UNION ALL SELECT 1, 200 FROM DUAL UNION ALL SELECT 2, 300 FROM DUAL UNION ALL SELECT 2, 400 FROM DUAL UNION ALL SELECT 3, 500 FROM DUAL UNION ALL SELECT 4, 600 FROM DUAL ) SELECT AA.이름, BB.구매수량, AA.판매수량, BB.구매수량-AA.판매수량 잔여수량 FROM ( SELECT A.BONAME AS 이름 , COUNT(*) AS 판매수량 FROM BO A , PO B , JO C WHERE A.BONUMBER = B.PONUMBER AND B.POSEQ = C.POSEQ GROUP BY A.BONAME ) AA ,( SELECT A.BONAME AS 이름 , SUM(C.VOLUME) AS 구매수량 FROM BO A , PO B , XO C WHERE A.BONUMBER = B.PONUMBER AND B.POSEQ = C.POSEQ GROUP BY A.BONAME ) BB WHERE AA.이름 = BB.이름 ;
답변 정말 감사합니다.
제가 위의 설명을 좀더 자세히 했어야 했는데 죄송합니다.
제가 한가지 설명을 빼먹은게 있어서 댓글드립니다.
1. bo 테이블에 값이 총 271개가 있습니다. 양이많아 4개만 예를 들어쓴겁니다.
2. po 테이블에 값은 총 809개가 있습니다. 포도즙,포도주스 = 포도 로 한거와 같이 809개가 나열되어있습니다. 그걸 간추려 271개가 된거구여
2. xo 테이블에는 volume이 0인 것도 있습니다.
3. jo 테이블에는 po테이블에있는 seq를 가지고 있는것도 있고 안가지고 있는것도 있습니다.
최종 결과를 추가 예를 들자면
이름 | 구매수량 | 판매수량 | 잔여수량 |
포도 | 13 | 4 | 9 |
바나나 | 5 | 2 | 3 |
딸기 | 0 | 3 | -3 |
오렌지 | 0 | 0 | 0 |
결론은 271개 이름에 대해서 전부 나와야 합니다.
한번더 도움 주시면 감사하겠습니다.
SELECT bo.boname 이름 , NVL(SUM(xo.volume), 0) 구매수량 , NVL(SUM(jo.cnt ), 0) 판매수량 , NVL(SUM(xo.volume), 0) - NVL(SUM(jo.cnt), 0) 잔여수량 FROM bo LEFT OUTER JOIN po ON bo.bonumber = po.ponumber LEFT OUTER JOIN xo ON po.poseq = xo.poseq LEFT OUTER JOIN (SELECT poseq , COUNT(*) cnt FROM jo GROUP BY poseq ) jo ON po.poseq = jo.poseq GROUP BY bo.boname ;
마농님 제가 한가지 빼먹은게 있었는데 이거는 제가하려고 했는데 값이 자꾸 이상하게 나오네여ㅠㅠ
1. 구매한 사람들을 종합할때 예외 해야할 사람들이 있어서 그사람들은 예외하고 합계를해야해서
근데 문제는 jo 테이블에 있는 user와
users라는 테이블(예로 데이터2개,실제 데이터 양은 많음)에
user | userseq |
100 | 52662 |
200 | 71334 |
employee라는 테이블에
userseq | userid | orgseq |
52662 | 693156 | 13823 |
71334 | x151100024 | 12903 |
orgs라는 테이블에
orgseq | orgcode |
13823 | p001 |
12903 | xp001 |
이렇게 되어있어서
쿼리 주신거에 users라는 테이블과 user테이블과 조인하였고
users라는 테이블과 employee 테이블과 조인하였고
employee 테이블과 orgs 테이블과 조인하여
마지막 where 절로
orgs.orgcode not like 'x%' and employees.employeeid not like 'x%'를하였으나
ora-00904로 user,user :부적합한 식별자라는 에러가 나오더라구여
그래서 보니깐 마지막 조인 부분에 user 조인한거 보니깐
user.poseq만 가져오더라구여 그것때문에 그런거 같은데
orgcode와 employeeid에 x로 들어가는 사람은 제외하고 수량 확인하고싶은데 가능할까요??
WITH bo(bonumber, boname) AS ( SELECT 5989, '포도' FROM dual UNION ALL SELECT 9365, '포도' FROM dual UNION ALL SELECT 10327, '바나나' FROM dual UNION ALL SELECT 4384, '바나나' FROM dual ) , po(poseq, ponumber, poname) AS ( SELECT 1, 5989, '포도즙' FROM dual UNION ALL SELECT 2, 9365, '포도주스' FROM dual UNION ALL SELECT 3, 10327, '바나나주스' FROM dual UNION ALL SELECT 4, 4384, '바나나우유' FROM dual ) , xo(poseq, volume) AS ( SELECT 1, 10 FROM dual UNION ALL SELECT 2, 3 FROM dual UNION ALL SELECT 3, 5 FROM dual UNION ALL SELECT 4, null FROM dual ) , jo(poseq, usr) AS ( SELECT 1, 100 FROM dual UNION ALL SELECT 1, 200 FROM dual UNION ALL SELECT 2, 300 FROM dual UNION ALL SELECT 2, 400 FROM dual UNION ALL SELECT 3, 500 FROM dual UNION ALL SELECT 4, 600 FROM dual ) , users(usr, userseq) AS ( SELECT 100, 52662 FROM dual UNION ALL SELECT 200, 71334 FROM dual ) , employee(userseq, userid, orgseq) AS ( SELECT 52662, '693156' , 13823 FROM dual UNION ALL SELECT 71334, 'x151100024', 12903 FROM dual ) , orgs(orgseq, orgcode) AS ( SELECT 13823, 'p001' FROM dual UNION ALL SELECT 12903, 'xp001' FROM dual ) SELECT bo.boname 이름 , NVL(SUM(xo.volume), 0) 구매수량 , NVL(SUM(jo.cnt), 0) 판매수량 , NVL(SUM(xo.volume), 0) - NVL(SUM(jo.cnt), 0) 잔여수량 FROM bo LEFT OUTER JOIN po ON bo.bonumber = po.ponumber LEFT OUTER JOIN xo ON po.poseq = xo.poseq LEFT OUTER JOIN (SELECT jo.poseq , COUNT(*) cnt FROM jo INNER JOIN users u ON jo.usr = u.usr INNER JOIN employee e ON u.userseq = e.userseq INNER JOIN orgs o ON e.orgseq = o.orgseq WHERE o.orgcode NOT LIKE 'x%' AND e.userid NOT LIKE 'x%' GROUP BY jo.poseq ) jo ON po.poseq = jo.poseq GROUP BY bo.boname ;