结果数据集中的SQL事例表达式问题
此SQL查询返回此结果集:结果数据集中的SQL事例表达式问题,sql,sql-server,case,Sql,Sql Server,Case,此SQL查询返回此结果集: 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
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
在结果集中,“openingbalance”应仅在第一行指定。
剩下的行应该显示“openbalance”为0。您没有指定您使用的RDBMS,但是您需要
当1==ROW_NUMBER()超过(…)然后是b时的情况。Balance ELSE 0 END
或DB支持的任何等效项
要确定OVER子句的确切内容,您必须更清楚地指定“第一”行是什么。如果你的意思是第一行,你可以直接使用(
OVER(ORDER BY Account\u Id,Channel\u Desc,Min\u Range)
,但这可能不是你想要的。嗨,Nickolay,我使用的是SQL SERVER 2016。@BARG在这种情况下,行号可以工作(),问题是你需要哪一行。您应该按更改顺序,并可能在此基础上添加分区。嗨,Nicholai,我尝试使用,case when 1=行数()OVER(按帐户的顺序),然后b.Balance else 0结束为openingbalance,但除第一行外,所有其他行都变为0。如何根据列进行分组?假设您有具有相同帐户id的行,将“第一行”定义为“按帐户id排序时的第一行”将无法正常工作:根据该定义,帐户id最小的任何行都可能恰好是第一行。“除第一行外,所有其他行都将变为0”这正是你在问题中要求的。我不确定我是否理解“基于列的组”。如果要标识每个组(由Y标识)中的第一行(按X排序),可以使用按Y划分(按X排序)
。你有没有试着在网上阅读文档或其他解释?你在使用哪种产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称(您使用的是非标准SQL)。请为您正在使用的数据库产品postgresql
,oracle
,sqlserver
,db2
。。。
| 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 |