Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结果数据集中的SQL事例表达式问题_Sql_Sql Server_Case - Fatal编程技术网

结果数据集中的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

此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.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 |