多个供应商付款的年同比差异

时间:2018-05-07 22:21:38

标签: sql sql-server

我的数据库按月存储向不同供应商付款。我试图计算供应商支付的最近一年的百分比差异。我的代码一直出错,我不知道如何完成这个查询。最近的付款(排名最高)应该是((新旧)/旧)* 100部分中的“新”因素。

理想的结果:

公司A | 2015年| 400美元| 0%

公司A | 2016 | 400美元| 0%

公司A | 2017年| 800美元100%

公司B | 2014 | 20美元| 0%

公司B | 2015年| 30美元| 50%

公司B | 2016 | 15美元| -50%

公司B | 2017年| 30美元| 100%

我目前的成绩:

公司名称|年|付款1 |付款2

公司A | 2015年| 400美元| 400美元

公司A | 2016 | 400美元| $ 400

公司A | 2017年| 800美元$ 800

公司B | 2014 | 20美元| $ 20

公司B | 2015年| 30美元| $ 30

公司B | 2016 | 15美元| $ 15

公司B | 2017年| 30美元| $ 30

以下是我的问题:

SELECT 
  [VENDOR_ID]
 ,YEAR([PMT_DATE]) as "YEAR"
 ,SUM([PMT_PER_MONTH]) as "PAYMENT"
,SUM([PMT_PER_MONTH]) as “PAYMENT 2”
      ,RANK() OVER (   PARTITION BY [VENDOR_ID]
                       ORDER BY YEAR([PMT_DATE]) ASC ) AS RANKNUM
FROM [dbo].[VendorPaymentTracker]
WHERE CAST ([PMT_DATE] as DATE) between '2012-01-01' and '2017-12-31'
GROUP BY [VENDOR_ID], year([PMT_DATE]), [PMT_PER_MONTH]
)
SELECT [VENDOR_ID], [YEAR], [PAYMENT], [PAYMENT 2]
-- ,round(([PAYMENT] – [PAYMENT 2] / [PAYMENT 2]) * 100)DIFF_PERCENT
FROM CTE

1 个答案:

答案 0 :(得分:0)

您真正需要的是lag()

select vendor_id
       year(pmt_date) as yr
       sum(pmt_per_month) as payment,
       (sum(pmt_per_month) / nullif(lag(sum(pmt_per_month)) over (partition by vendor_id order by year(pmt_date)), 0) - 1) as increase
from dbo.VendorPaymentTracker pt
where pmt_date >= '2012-01-01' and pmt_date < '2018-01-01'
group by vendor_id, year(pmt_date);