从具有相同ID的具有多个行的表中获取每个ID有一行且具有多列的表,并根据条件计算总和

洛伦佐

这是我的佣金表,其中某些ID有两个条目,而其他ID只有一个。如果在原始委托日期后30天内有冲销分录,则应冲销原始佣金,但是如果反向输入在30天之后,则应将其忽略。

lead_id 佣金日期 佣金
22940 2020年1月3日 30
22940 2020年3月30日 -30
22941 30/04/2020 30
22942 2020年3月31日 60
22942 15/06/2020 -60

因此,这是我想要进入的决赛桌。

lead_id 总佣金
22940 0
22941 30
22942 60

我为查询的第一部分编写的代码应该为任何Lead_id产生一行记录,同时存储佣金日期和佣金金额(如果存在)(某些ID只有一个条目,而没有反向佣金)。这是代码

WITH TAB_RN AS
(
      SELECT commissions.lead_id, commissions.commission_date, commissions.commission_amount, ROW_NUMBER() OVER (PARTITION BY commissions.lead_id, commissions.commission_date) AS RN
  FROM commissions
)
SELECT T1.lead_id, 
       T1.commission_date AS DATE1, T1.commission_amount AS amount1
       T2.commission_date AS DATE2, T2.commission_amount AS amount2
FROM TAB_RN T1
LEFT JOIN TAB_RN T2 ON T1.lead_id = T2.lead_id AND T1.commission_date = T2.commission_date AND T2.RN = 2
WHERE T1.RN = 1

它应该产生这个结果

lead_id 日期1 数量1 日期2 数量2
22940 2020年1月3日 30 2020年3月30日 -30
22941 30/04/2020 30
22942 2020年3月31日 60 15/06/2020 -60

但是我却回来了

lead_id 日期1 数量1 日期2 数量2
22940 2020年1月3日 30
22940 2020年3月30日 -30
22941 30/04/2020 30
22942 2020年3月31日 60
22942 15/06/2020 -60

然后,我想计算日期1和日期2之间的差额,如果该差额少于30天,则金额1和金额2相等,否则仅应计入金额1。

最后,我想将该表与Commissions.company = companies.id上的companies表一起加入并按company x进行过滤

霍根

只是分解

选择佣金

select lead_id, commission_date, commission
from commissions
where commission > 0

然后将其加入有效的返还佣金

select commissions.lead_id, commissions.commission_date, commissions.commission + ret.commission as commission_total
from commissions
join (
  -- returned commissions have negative value.
  select lead_id, commission_date, commission
  from commissions
   where commsion < 0
) ret on commissions.lead_id = ret.ldead_id
       and   commissions.commission= ret.commission * -1
       and datediff(day,ret.commission_date,comm commissions.commission_date) <=30
where commission > 0

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章