SELECT
b.Product_Code,
b.Account_Id,
b.Channel_Desc,
r.Min_Range, r.Max_Range,
b.Balance AS openingbalance,
CASE
WHEN b.Balance > r.Max_Range
THEN r.Max_Range - r.Min_Range
ELSE b.Balance - r.Min_Range
END AS Split_Balance,
(CASE
WHEN b.Balance > r.Max_Range THEN r.Max_Range - r.Min_Range
ELSE b.Balance - r.Min_Range
END) / balance AS weighted_Avg
FROM
[EDH_DM_PRD].[dbo].[DataMart_Deposit] AS b
JOIN
[DBStats].[dbo].[Split_balances] AS r ON b.Product_Code = r.Product_Code
AND b.Channel_Desc = r.Channel_Desc
AND b.Asat_Dt = '20190131'
AND b.Acct_Status_Desc = 'Open'
AND b.Balance >= 0
AND b.Product_Code = '2000-0100'
AND b.Channel_Desc = 'Broker BDMs'
AND b.Account_Id = '31179111'
ORDER BY
Account_Id, Channel_Desc, Min_Range
此SQL查询返回以下结果集:
| Product_Code | Account_Id | Channel_Desc | Min_Range | Max_Range | openingbalance | Split_Balance | weighted_Avg |
| 2000-0100 | 31179111 | Broker BDMs | 0.000 | 4999.990 | 122314.480 | 4999.990 | 0.04087815277471645221 |
| 2000-0100 | 31179111 | Broker BDMs | 5000.000 | 9999.990 | 122314.480 | 4999.990 | 0.04087815277471645221 |
| 2000-0100 | 31179111 | Broker BDMs | 10000.000 | 19999.990 | 122314.480 | 9999.990 | 0.08175638730590196679 |
| 2000-0100 | 31179111 | Broker BDMs | 20000.000 | 49999.990 | 122314.480 | 29999.990 | 0.24526932543064402513 |
| 2000-0100 | 31179111 | Broker BDMs | 50000.000 | 99999999999.990 | 122314.480 | 72314.480 | 0.59121765468814485414 |
在结果集中,应该只在第一行指定"openingbalance“。其余的行应将"openbalance“显示为0。
发布于 2019-05-15 07:28:13
您没有指定您使用的是什么RDBMS,但是您需要CASE WHEN 1 == ROW_NUMBER() OVER (...) THEN b.Balance ELSE 0 END
或您的DB支持的任何等效数据库。
要确定OVER子句中的确切内容,您必须更清楚地指定“第一行”是什么。如果从字面上看第一行,您可以只使用OVER (ORDER BY Account_Id,Channel_Desc,Min_Range)
,但这可能不是您想要的。
https://stackoverflow.com/questions/56139771
复制相似问题