我的数据库按月存储向不同供应商付款。我试图计算供应商支付的最近一年的百分比差异。我的代码一直出错,我不知道如何完成这个查询。最近的付款(排名最高)应该是((新旧)/旧)* 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
答案 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);