년, 월 및 품목의 모든 조합이 필요한 경우 해당 조합을 생성 한 다음 데이터를 가져와야합니다. 나머지는 비슷한 방법으로 이루어집니다 : 나는 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;