2014-04-17 1 views
0
SELECT  TOP (100) PERCENT yy, mm, Item, SUM(Qty) AS qty, COALESCE 
          ((SELECT  SUM(Qty) AS Expr1 
           FROM   dbo.v_Storage AS p 
           WHERE  (Item = i.Item) AND (mm < i.mm) AND (yy = i.yy)), 0) AS OpnQty 
FROM   dbo.v_Storage AS i 
GROUP BY yy, mm, Item 
ORDER BY yy, mm, Item 

을 가지고 있습니다.하위 쿼리는이를 제공합니다 이전의 모든 기록

하지만 qty가 mm = 3 인 경우 강조 표시된 항목이 표시되지 않습니다. 어떤 도움을 주시면 감사하겠습니다.

답변

1

년, 월 및 품목의 모든 조합이 필요한 경우 해당 조합을 생성 한 다음 데이터를 가져와야합니다. 나머지는 비슷한 방법으로 이루어집니다 : 나는 coalesce()을 대체

select yy.yy, mm.mm, i.Item, 
     sum(s.qty) as qty, 
     ifnull((SELECT SUM(Qty) 
       FROM dbo.v_Storage s2 
       WHERE (s2.Item = i.Item) AND (s2.mm < mm.mm) AND (s2.yy = yy.yy) 
      ), 0) AS OpnQty 
from (select distinct yy from v_Storage) yy cross join 
    (select distinct mm from v_Storage) mm cross join 
    (select distinct item from v_Storage) i left outer join 
    v_Storage s 
    on s.yy = yy.yy and s.mm = mm.mm and s.item = i.item 
group by yy.yy, mm.mm, i.item 
order by yy.yy, mm.mm, i.item; 

ifnull()입니다. 이 경우 coalesce()이 하위 쿼리를 두 번 실행하므로 ifnull()이 빠릅니다.

당신은 SQL 서버 2012을 사용하는 경우에는 누적 합계와 전체 하위 쿼리를 대체 할 수

select yy.yy, mm.mm, i.Item, 
     sum(s.qty) as qty, 
     coalesce(sum(s.qty), 0) over (partition by i.item, yy.yy order by mm.mm) as OpnQty 
from (select distinct yy from v_Storage) yy cross join 
    (select distinct mm from v_Storage) mm cross join 
    (select distinct item from v_Storage) i left outer join 
    v_Storage s 
    on s.yy = yy.yy and s.mm = mm.mm and s.item = i.item 
group by yy.yy, mm.mm, i.item 
order by yy.yy, mm.mm, i.item; 
관련 문제