日期:2014-05-17  浏览次数:20444 次

有关SQL一个列查询多次显示的问题
有一个查询,得到的结果为

select YEAR(ShipDate) AS NN,MONTH(ShipDate) AS YY,
SUM(coShipDetail.Amount*(case coOrder.CyNo when 100 then 1 when 101 then 0.8145 when 102 then 6.335 end))/10000 as AMT
from coShip
INNER JOIN coShipDetail ON coShip.ShipNo=coShipDetail.ShipNo
INNER JOIN coOrderDetail ON coOrderDetail.DetailNo=coShipDetail.COrderDetailNo
INNER JOIN coOrder   ON  coOrder.OrderNo=coOrderDetail.OrderNo
where YEAR(ShipDate) in (2011,2012,2013) 
Group by YEAR(ShipDate) ,MONTH(ShipDate)


NN YY AMT
2012 5 2907.46881656
2012 8 2062.00172383
2012 11 452.81510354
2011 10 2605.28769271
2011 7 2580.07436531
2011 1 3129.37040644
2011 4 2591.97323671
2012 2 2072.10832608
2012 9 2813.61357872
................

我想实现在这个查询后面多加一列,上个月的AMT,,请问如何修改上述查询呢!谢谢。
特别是2012年1月的结果,其上一个月的结果一定要显示出2011年12月的AMT结果。 
------最佳解决方案--------------------
select a.*,b.AMT as [上个月] 
from 
(
select  
YEAR(ShipDate) AS NN,MONTH(ShipDate) AS YY,
SUM(coShipDetail.Amount*(case coOrder.CyNo 
when 100 then 1 when 101 then 0.8145 when 102 then 6.335 end))/10000 as AMT
from coShip
INNER JOIN coShipDetail ON coShip.ShipNo=coShipDetail.ShipNo
INNER JOIN coOrderDetail ON coOrderDetail.DetailNo=coShipDetail.COrderDetailNo
INNER JOIN coOrder   ON  coOrder.OrderNo=coOrderDetail.OrderNo
where YEAR(ShipDate) in (2011,2012,2013) 
Group by YEAR(ShipDate) ,MONTH(ShipDate)
) a left join 
(
select  
YEAR(DATEADD(mm,1,ShipDate)) AS NN,MONTH(DATEADD(mm,1,ShipDate)) AS YY,
SUM(coShipDetail.Amount*(case coOrder.CyNo 
when 100 then 1 when 101 then 0.8145 when 102 then 6.335 end))/10000 as AMT
from coShip
INNER JOIN coShipDetail ON coShip.ShipNo=coShipDetail.ShipNo
INNER JOIN coOrderDetail ON coOrderDetail.DetailNo=coShipDetail.COrderDetailNo
INNER JOIN coOrder   ON  coOrder.OrderNo=coOrderDetail.OrderNo
where YEAR(ShipDate) in (2011,2012,2013) 
Group by YEAR(DATEADD(mm,1,ShipDate)) ,MONTH(DATEADD(mm,1,ShipDate))
) b
on a.NN=b.NN and a.YY=b.YY

------其他解决方案--------------------
如果你不能直接从这个语句的结果中算出来,那就先算出来,然后和这个结果join 起来
------其他解决方案--------------------
算出来,如何对应?
------其他解决方案--------------------
你的表中能不能直接计算出上个月的AMT数据,可以的话直接,查询中再加一列
------其他解决方案--------------------
上次有个哥们写了的,但是显示的显示本月是1月份的话,上个月就不能显示出来了
------其他解决方案--------------------
先把头两列组合成dateteime字段,然后datediff
------其他解决方案--------------------
没人帮忙写个嘛?
------其他解决方案--------------------
select a.NN,a.YY,a.AMT,b.AMT
from 
(
select  row_number() over(order by YEAR(ShipDate),MONTH(ShipDate)) as rownum,