2017-03-28 1 views
-1

SQL Server는 처음이지만 PL/SQL을 조금 사용했습니다.
부품 번호가있는 쿼리를 작성하고 현재 재고를 합산 한 다음 지난 180 일 동안 판매 된 QTY의 평균을 구합니다. 이것은 내가 지금까지 가지고있는 것이다.모두 동일한 부품 번호, 한 테이블의 SUM, 다른 테이블의 평균

SELECT 
    S.PartNum, S.PartDescription, S.CLASSID, SUM(D.STOCK), AVG(S2.QTY)  
    FROM PARTWHSE AS D  
    JOIN PART AS S ON S.PartNum = D.PartNum 
    LEFT JOIN PARTTRAN AS S2 ON S2.PartNum = S.PartNum 
    WHERE S.TRACKCODE = 0 
    AND S2.TRANDATE >= (GETDATE() -180) 
    GROUP BY PartNum, PartDescription, CLASSID; 

문제는 내 합계가 제가 그것을 요약하면 너무 많은 행에 데려 오는 생각에 이르게하는 방법 오프 (이상) 들어오는 유지한다. 평균값은 괜찮습니다. 평균없이 합계 괜찮아요.

샘플 데이터 표 01
PartNum | 재고 |
101.123 | 100 |
101.123 | 250 |
101.123 | 150 |

샘플 데이터 표 02

PartNum | QTY
101.123 | 200
101.123 | 200
101.123 | (200)

현재 결과 S.PartNum | Sum(D.STOCK) | AVERAGE (S2.QTY)
101.123 | 3,000 | (200)

원하는 결과 S.PartNum | Sum (STOCK) | AVERAGE (S2.QTY)
101.123 | 500 | 200

도움을 주시면 감사하겠습니다. 단일 쿼리에서 수행하는 것이 바람직합니다.

+0

더 나은 결과를 얻으려면 세 테이블 모두에 대한 샘플 데이터를 게시하십시오. – etsa

답변

0

를 사용하여 적절한 집계 함수 및 그룹화 2의 서브 쿼리. STOCK 및 QTY에 대해 다른 테이블이 있고이 테이블의 행간에 (시간 소인 또는 다른 키로) 상관 관계가없는 데이터의 문제점.

select p.PartNum, isnull(s.Stock, 0) as Stock, isnull(q.Qty, 0) as Qty 
from PART p 
left join 
(
    select s.PartNum, sum(s.Stock) as Stock 
    from PARTWHSE s 
    group by s.PartNum 
) s on s.PartNum = p.PartNum 
left join 
(
    select q.PartNum, avg(q.QTY) as Qty 
    from PARTTRAN q 
    group by q.PartNum 
) q on q.PartNum = p.PartNum
+0

감사합니다. Oryol. 이것에 얼룩은 잘 움직였다. 하위 쿼리 FTW – Darreningym

관련 문제