![](/img/trans.png)
[英]In PostgreSQL, in a table with multiple rows per unique ID, can you select one row by a condition per unique ID and other values?
[英]Get a table with one row per id and multiple columns from a table with multiple rows for same id and calculate sum based on condition
這是我的佣金表,其中一些 id 有兩個條目,而另一些只有一個。 如果在原始佣金日期后 30 天內有反向輸入,則應撤銷原始佣金,但如果反向輸入是在 30 天之后,則應忽略它。
線索ID | 佣金日期 | 委員會 |
---|---|---|
22940 | 2020 年 1 月 3 日 | 30 |
22940 | 2020 年 3 月 30 日 | -30 |
22941 | 2020 年 4 月 30 日 | 30 |
22942 | 2020 年 3 月 31 日 | 60 |
22942 | 15/06/2020 | -60 |
因此,這是我想要去的最后一張桌子。
線索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
它應該產生這個結果
線索ID | 日期 1 | 金額1 | 日期 2 | 金額2 |
---|---|---|---|---|
22940 | 2020 年 1 月 3 日 | 30 | 2020 年 3 月 30 日 | -30 |
22941 | 2020 年 4 月 30 日 | 30 | ||
22942 | 2020 年 3 月 31 日 | 60 | 15/06/2020 | -60 |
但相反,我回來了
線索ID | 日期 1 | 金額1 | 日期 2 | 金額2 |
---|---|---|---|---|
22940 | 2020 年 1 月 3 日 | 30 | ||
22940 | 2020 年 3 月 30 日 | -30 | ||
22941 | 2020 年 4 月 30 日 | 30 | ||
22942 | 2020 年 3 月 31 日 | 60 | ||
22942 | 15/06/2020 | -60 |
然后我想計算日期 1 和 2 之間的差異,如果差異小於 30 天總金額 1 和金額 2,否則只應計算金額 1。
最后,我想在commissions.company = Companies.id 上加入公司表並按公司x 過濾
把它分解
Select 用於佣金
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.