Sql 多个供应商付款的同比百分比差异
我的数据库存储每月向不同供应商支付的款项。我试图计算最近一年与去年的百分比差异在多少供应商支付。我的代码不断出错,不确定如何完成此查询。最近的付款(排名最高)应为等式((新旧)/旧)*100部分中的“新”因素 理想结果:Sql 多个供应商付款的同比百分比差异,sql,sql-server,Sql,Sql Server,我的数据库存储每月向不同供应商支付的款项。我试图计算最近一年与去年的百分比差异在多少供应商支付。我的代码不断出错,不确定如何完成此查询。最近的付款(排名最高)应为等式((新旧)/旧)*100部分中的“新”因素 理想结果: SELECT [VENDOR_ID] ,YEAR([PMT_DATE]) as "YEAR" ,SUM([PMT_PER_MONTH]) as "PAYMENT" ,SUM([PMT_PER_MONTH]) as “PAYMENT 2” ,RANK() O
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
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%
我当前的结果:
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 |付款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
您真正需要的是
lag()
:
选择供应商\u id
年份(付款日期)为年
付款金额(每月付款),
(金额(每月付款)/nullif(滞后(金额(每月付款))超过(按供应商id订单按年份划分(付款日期)),0)-1)作为增加
来自dbo.VendorPaymentTracker pt
其中,付款日期>='2012-01-01'和付款日期<'2018-01-01'
按供应商id、年份(付款日期)分组;
Hi Gordon,我得到一个被零除的错误。在lag函数之前添加一个“nullif”似乎不起作用。有什么建议吗?