2014-05-18 6 views
0

나는이 쿼리를 통해 매월의 항목 수를 확인합니다. 하지만누적 결과에 대한 쿼리 최적화

SELECT 
COUNT(ITM.ID) AS ItemCount, 
Month(ITM.ItemProcureDate), 
Year(ITM.ItemProcureDate) 
    FROM 
    Rpt_Item ITM 
    WHERE 
    ITM.ItemProcureDate IS NOT NULL  
    AND 
    ITM.ItemStatusID = 2   --  Item sold, Item Rejected 
    AND 
    ITM.ItemProcureDate >= CONVERT(DATETIME,'02/01/2014',1) [email protected]_Date 
    AND 
    ITM.ItemProcureDate <= CONVERT(DATETIME,'04/12/2014',1) [email protected]_Date 
    GROUP BY 
    Month(ITM.ItemProcureDate), 
    Year(ITM.ItemProcureDate) 

쿼리 결과는 다음과 같이해야한다 누적 결과에 대한 최적화 된 쿼리를 찾고 있어요 : 나는 Item_Sold, Item_Rejected을 찾을 수있다

Item sold In month  2 
Item Sold Till Month  2 
Item Rejected   1  
Item Rejected Till Month 1 
Year    2014 
Month    Feb 
Last Date of Month  02/28/2014 

----------------------------------------------- 
Item sold In month  2 
Item Sold Till Month  4 
Item Rejected   1  
Item Rejected Till Month   2 
Year    2014 
Month    March 
LastDate of Month  03/31/2014 

----------------------------------------------- 
Item sold In month  2 
Item Sold Till Month  6 
Item Rejected   1  
Item Rejected Till Month 3 
Year    2014 
Month    April 
Last Date of Month  04/30/2014 

곳마다 다음 달 지난 석 달 동안 Item_Added 이전의 모든 Item_Sold, Item_Rejected, Item_Added 값을 누적해야합니다.

+2

쿼리가 의미가 없습니다. 'from' 절에없는'RSK'와'IA'와 같은 테이블 별칭을 사용합니다. –

+0

판매/거부 논리는 무엇입니까? 행과 열을 바꿔 월간 한 행, 프로그램 또는 보고서를위한 프레 젠 테이션 레이어를 남기면 모든 쿼리가 더 쉬워 짐 – Serpiton

+0

결과를 생성하려는 쿼리 은 기본 버전이 최적화되지 않았습니다. 쿼리 다른 것 –

답변

0

SQL Server 2008에서는 상관 하위 쿼리를 사용하거나 비 equijoin을 사용하여이 작업을 수행 할 수 있습니다. SQL Server 2012는 누적 합계 기능을 지원합니다. 여기에 상관 하위 쿼리와 함께 할 수있는 방법은 다음과 같습니다 이것은 YYYYMM 형식으로 년 - 월을두고

with ym as (
     SELECT COUNT(ITM.ID) AS ItemCount, 
      Month(ITM.ItemProcureDate) as mon, Year(ITM.ItemProcureDate) as yr, 
      Month(ITM.ItemProcureDate) + 100*Year(ITM.ItemProcureDate) as yyyymm 
     FROM Rpt_Item ITM 
     WHERE ITM.ItemProcureDate IS NOT NULL AND 
      ITM.ItemStatusID = 2 AND 
      ITM.ItemProcureDate >= CONVERT(DATETIME,'02/01/2014',1) AND 
      ITM.ItemProcureDate <= CONVERT(DATETIME,'04/12/2014',1) 
     GROUP BY Month(ITM.ItemProcureDate), Year(ITM.ItemProcureDate) 
    ) 
select ym.*, 
     (select sum(ItemCount) 
     from ym ym2 
     where ym.yyyymm <= ym.yyyy.mm 
     ) as cumsum 
from ym; 

하는 것으로. 이것은 단지 편의이므로 기간에 대한 비교는 하나의 열만 사용합니다.

테이블이 실제로 크기가 크거나보기 인 경우도 마찬가지입니다. 성능에 문제가있는 경우 CTE 대신 임시 테이블을 사용하십시오. SQL Server는 CTE를 구체화하지 않으므로 코드를 두 번 실행하게됩니다.

+0

고든 고마워, 너의 쿼리를 해봅시다. –