2017-07-17 315 views
0

我需要计算年初至今和去年YTD在一张表[SQL Server 2012]上。以下是我试过的查询。在某些情况下,它会增加一倍和三倍。SQL YTD和去年YTD完整数据

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 

enter image description here

+0

将样本数据添加为图像不会对您有所帮助..没有人可以使用它来测试查询。以表格格式添加样本数据作为文本..在SO中有68年时间的68个问题你应该知道这个.. –

+2

如果这些值完全是双倍和三倍,那么这是一个很好的迹象,表明你正在查询返回多个行为你的一些分组。这通常表示连接谓词不正确。我们不可能提供任何细节,因为您没有为我们提供任何细节。这里是一个开始的好地方。 https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/ –

+2

第一次连接返回* n *行的* n *个月和第二个月加入到另外的n个月,即一月份正确,二月份为二月份,三月份为三月份等。快速肮脏的解决方案:将LY_YTD'除以月份编号。清理解决方案:重写为两个选择(当前和去年)和外部联接它们。 – dnoeth

回答

2

您可以使用如下窗口函数:

;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 

但这种解决方案假定我们对每一个年份和月份ATLEAST一个条目。