完整数据上的SQL年初至今和去年年初至今

完整数据上的SQL年初至今和去年年初至今,sql,sql-server,Sql,Sql Server,我需要在表[SQL Server 2012]上计算年初至今和去年年初至今。下面是我尝试过的问题。在某些情况下,它会加倍甚至加倍 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

我需要在表[SQL Server 2012]上计算年初至今和去年年初至今。下面是我尝试过的问题。在某些情况下,它会加倍甚至加倍

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

您可以按如下方式使用窗口功能:

;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

但此解决方案假定我们每个月和每年至少有一个条目。

您可以使用如下窗口功能:

;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

但此解决方案假定我们每个月和每年至少有一个条目。

将示例数据添加为图像不会对您有所帮助。。没有人可以用它来测试查询。以表格格式将示例数据添加为文本。。68个问题,用了7年的时间,所以你应该知道这一点。如果值正好是两倍和三倍,那么这是一个很好的迹象,表明你的查询为一些分组返回了多行。这通常是连接谓词不正确的标志。我们不可能提供任何细节,因为您没有为我们提供任何细节。这是一个很好的起点。第一个联接返回n个月的n行,第二个联接将这些n个月联接到另一个n个月,即1月正确,2月正确,3月正确,等等。快速脏解决方案:将LY_YTD除以月数。干净的解决方案:重写为当前和去年的两个选择,并将它们外部联接。@dnoeth我用两个选择重写了查询,结果成功了。谢谢。将示例数据添加为图像无助于您。。没有人可以用它来测试查询。以表格格式将示例数据添加为文本。。68个问题,用了7年的时间,所以你应该知道这一点。如果值正好是两倍和三倍,那么这是一个很好的迹象,表明你的查询为一些分组返回了多行。这通常是连接谓词不正确的标志。我们不可能提供任何细节,因为您没有为我们提供任何细节。这是一个很好的起点。第一个联接返回n个月的n行,第二个联接将这些n个月联接到另一个n个月,即1月正确,2月正确,3月正确,等等。快速脏解决方案:将LY_YTD除以月数。干净的解决方案:重写为当前和去年的两个选择,并将它们外部联接。@dnoeth我用两个选择重写了查询,结果成功了。非常感谢。