2014-11-12 1 views
0

내가 단순화 한 두 개의 CTE 쿼리를 가지고 있고, SELECT 문 아래 2 개 룩업 테이블에 가입 희망 : 그래서 절에서 다양한 시도했습니다CTE 및 가입이 개 룩업 테이블

with salesCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from sales 
    group by itemCode, customerCode 
    order by 1 
), 
paymentsCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from payments 
    group by itemCode, customerCode 
    order by 1 
) 
select 
    il.itemCode as itemCode, 
    il.itemName as itemName, 
    cl.customerCode as customerCode, 
    cl.customerName as customerName, 
    sal.quantity as quantitySold, 
    pay.quantity as quantityPaid, 
    sal.quantity - pay.quantity as quantityBalance 
from 
--This is where I'm having issues 

을하지만, 나는 결과 세트를 얻지 못하거나 예상되는 결과 중 아주 작은 부분 일뿐입니다.

작동하지 않는 시도의 비록 내가 한 가장 논리적 인 하나 (무 반응) : 나는 또한 시도

from items il 
join salesCTE sal on il.itemCode = sal.itemCode 
join paymentsCTE pay on il.itemCode = pay.itemCode 
join customers cl on (cl.customerCode = sal.custCode OR cl.customerCode = pay.custCode) 
where 0=0 

:

from items il, customers cl, salesCTE sal, paymentsCTE pay 
where 0=0 
and (il.itemCode = sal.itemCode OR il.itemCode = pay.itemCode) 
and (cl.customerCode = sal.custCode OR il.itemCode = pay.custCode) 

내가 너무 많은 일을하려고 이 쿼리는?

또한 일부 더미 데이터와 SQL 바이올린을 설정 한

: http://sqlfiddle.com/#!4/4de7b/7 아래

이 customerCode = '102'에 대한 예상 결과입니다

╔══════════╦══════════════╦══════════════╦══════════════╦══════╦══════╦═════════╗ 
║ ItemCode ║ ItemName ║ CustomerCode ║ CustomerName ║ Sold ║ Paid ║ Balance ║ 
╠══════════╬══════════════╬══════════════╬══════════════╬══════╬══════╬═════════╣ 
║  903 ║ Cowl   ║   102 ║ Clark Kent ║ 0 ║ 1 ║  -1 ║ 
║  900 ║ Web Shooters ║   102 ║ Clark Kent ║ 0 ║ 3 ║  -3 ║ 
╚══════════╩══════════════╩══════════════╩══════════════╩══════╩══════╩═════════╝ 

아이디어는 그 기록이있는 경우 판매 테이블에 삽입, ItemCode 900의 경우 Sold은 1, 밸런스는 -2가됩니다.

답변

1
with salesCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from sales 
    group by itemCode, customerCode 
    order by 1 
), 
paymentsCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from payments 
    group by itemCode, customerCode 
    order by 1 
) 
select 
    il.itemCode as itemCode, 
    il.itemName as itemName, 
    cl.customerCode as customerCode, 
    cl.customerName as customerName, 
    sal.quantity as quantitySold, 
    pay.quantity as quantityPaid, 
    sal.quantity - pay.quantity as quantityBalance 
from salesCTE sal 
    full outer join paymentsCTE pay on (sal.itemCode = pay.itemCode) 
    join items il on nvl(sal.itemCode, pay.itemCode) = il.itemCode 
    join customers cl on (case when pay.itemCode is null then sal.custCode else pay.custCode end) = cl.customerCode; 

귀하는 귀하의 상품 지불 및 판매에 대한 정보를 얻고 싶다고 생각합니다.

이 경우 모든 품목 코드를 검색하려면 판매 및 지불을 완전히 가입해야합니다.

그러면 고객 및 항목에 가입하여 추가 정보를 얻을 수 있습니다 (지불 또는 판매 열에서 가입해야 함).

P. 귀하의 바이올린 데이터에는 이상한 것이 있습니다 - 판매에는 품목 테이블에없는 품목 코드가 들어 있습니다. 나는 바이올린

다른 옵션으로 판매에 삽입 할 때 그냥 열 값을 혼합 생각 : 그것은 그렇다면 당신은 LEFT 대신 항목 가입의 항목 (하지만 정말 이상하다)

업데이트 가입 사용할 수 있습니다 - 각 품목 및 고객에 대한 정보를 모두 받아야하는 경우. 내가 데이터를 무작위

with salesCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from sales 
    group by itemCode, customerCode 
    order by 1 
), 
paymentsCTE (itemCode, custCode, quantity) as (
    select 
     itemCode as itemCode, 
     customerCode as custCode, 
     sum(quantity) as quantity 
    from payments 
    group by itemCode, customerCode 
    order by 1 
) 
select 
    il.itemCode as itemCode, 
    il.itemName as itemName, 
    cl.customerCode as customerCode, 
    cl.customerName as customerName, 
    nvl(sal.quantity, 0) as quantitySold, 
    nvl(pay.quantity, 0) as quantityPaid, 
    nvl(sal.quantity, 0) - nvl(pay.quantity, 0) as quantityBalance 
from salesCTE sal 
    full outer join paymentsCTE pay on (sal.itemCode = pay.itemCode 
             and sal.custCode = pay.custCode) 
    join items il on nvl(sal.itemCode, pay.itemCode) = il.itemCode 
    join customers cl on nvl(sal.custCode, pay.custCode) = cl.customerCode; 
+0

, 난 다시 가서 더 논리적 세트를 작성 : itemcode 및 custCode에 의해 모두 가입이 경우

당신은 전체 필요합니다. 나는 그 결과를보고 있으며, 그것이 형성되어 보이지만, 약간의 불일치가있는 것으로 보인다. 하지만 그건 내가 가진 것보다 훨씬 더 나아 갔다. 나는 네가 지금까지 가지고있는 것을 해결할 것이다. – Chester

+0

@Chester 예, 고객 가입에 문제가있었습니다. 내 대답을 업데이트했습니다 – Multisync

+0

@Chester 또한 동일한 항목 코드 및 다른 고객이있는 판매 및 지불 행이 있으면 문제가있을 수 있습니다. 그렇다면 고객을 두 번 참여해야합니다. – Multisync