Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 多个供应商付款的同比百分比差异_Sql_Sql Server - Fatal编程技术网

Sql 多个供应商付款的同比百分比差异

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

我的数据库存储每月向不同供应商支付的款项。我试图计算最近一年与去年的百分比差异在多少供应商支付。我的代码不断出错,不确定如何完成此查询。最近的付款(排名最高)应为等式((新旧)/旧)*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
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”似乎不起作用。有什么建议吗?