完整数据上的SQL年初至今和去年年初至今
我需要在表[SQL Server 2012]上计算年初至今和去年年初至今。下面是我尝试过的问题。在某些情况下,它会加倍甚至加倍完整数据上的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
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我用两个选择重写了查询,结果成功了。非常感谢。