简体   繁体   中英

SQL YTD and last year YTD on complete data

I need to calculate YTD and last year YTD on a table [SQL Server 2012]. Below is the query I tried. Its getting doubled and tripled for some cases.

SELECT SUM(A.RevisionNumber)YTD,SUM(P.RevisionNumber)LY_YTD,B.OrderDateM,B.OrderDateY
FROM
    (select MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY from sales.SalesOrderHeader B
    group by MONTH(OrderDate),YEAR(OrderDate))B
 LEFT JOIN
    (select SUM(RevisionNumber)RevisionNumber,MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY
    from sales.SalesOrderHeader
    group by MONTH(OrderDate),YEAR(OrderDate))A
 ON A.OrderDateM<=B.OrderDateM AND A.OrderDateY=B.OrderDateY
 LEFT JOIN
    (select SUM(RevisionNumber)RevisionNumber,MONTH(OrderDate)OrderDateM,YEAR(OrderDate)OrderDateY
    from sales.SalesOrderHeader
    group by MONTH(OrderDate),YEAR(OrderDate))P
 ON P.OrderDateM<=B.OrderDateM AND P.OrderDateY=B.OrderDateY-1
GROUP BY B.OrderDateM,B.OrderDateY
ORDER BY B.OrderDateY,B.OrderDateM

在此处输入图片说明

You can use windowing function as below:

;With cte as (
    Select Sum(RevisionNumber) As SM_RevisionNumber, Month(OrderDate) as OrderM,
           Year(OrderDate) as OrderY
           From Sales.SalesOrderHeader
           Group by Month(OrderDate), Year(OrderDate)
        ), cte2 as (
    Select YTD = Sum(SM_RevisionNumber) over (partition by OrderY order by OrderM),
        OrderM, OrderY, RowN = Row_Number() over(order by OrderY, OrderM)
        from cte
    )
    Select YTD, LY_YTD = lag(YTD, 12, null) over(Order by RowN), OrderM, ORderY
        from cte2

But this solution assumes we have atleast one entry for each month and year.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM