【问题标题】:Year-Over-Year Percent Difference in Payments for Multiple Vendors多个供应商支付的同比百分比差异
【发布时间】:2018-05-09 10:36:53
【问题描述】:

我的数据库存储每月向不同供应商支付的款项。我正在尝试计算供应商薪酬的最新同比百分比差异。我的代码不断出错,不知道如何完成此查询。最近的付款(排名最高)应该是等式的 ((new-old)/old ) * 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

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    你真正需要的是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);
    

    【讨论】:

    • 嗨,戈登,我收到除以零的错误。在滞后函数之前添加“nullif”似乎不起作用。有什么建议吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2021-01-05
    • 2012-04-26
    相关资源
    最近更新 更多