SQL 嵌套 CASE 语句

标签 sql sql-server t-sql

我正在尝试更新销售分析多维数据集中的以下查询段。我对 SQL 不是很熟悉。

第一个 CASE 语句按其应有的方式工作 - 当 OINV.Canceled = 'Y' 时返回负值。

CASE OINV.Canceled WHEN 'Y' THEN - INV1.LineTotal 
ELSE INV1.LineTotal END AS LineTotal, 
CASE INV1.StockSum WHEN 0 THEN INV1.LineTotal 
ELSE INV1.StockSum END AS SaleValue, INV1.GrssProfit

我想要实现的是,当 OINV.Canceled = 'Y' 时,第二个 CASE 语句也返回负值 (SaleValue)。我想我需要在这里嵌套一个 CASE 语句,但我不确定。

最佳答案

two formats of Case Expression 。简单案例和搜索案例。 您可以使用搜索案例表达式来完成此操作。

CASE WHEN  OINV.Canceled = 'Y' THEN -INV1.StockSum 
     WHEN  INV1.StockSum = 0 THEN INV1.LineTotal
     ELSE  INV1.StockSum 
END AS SaleValue

或者可能是(取决于您的要求)

CASE WHEN  OINV.Canceled = 'Y' AND INV1.StockSum = 0 THEN -INV1.LineTotal
     WHEN  OINV.Canceled = 'Y' AND INV1.StockSum <> 0 THEN -INV1.StockSum 
     ELSE  INV1.StockSum 
END AS SaleValue

或者是嵌套的情况。在这里,您必须针对 OINV.Canceled 的不同值重复子案例表达式。

 CASE OINV.Canceled WHEN 'Y' THEN
                    -1 * CASE INV1.StockSum WHEN 0 THEN INV1.LineTotal 
                         ELSE INV1.StockSum END
                    ELSE 
                         CASE INV1.StockSum WHEN 0 THEN INV1.LineTotal 
                         ELSE INV1.StockSum END
 END AS SaleValue

关于SQL 嵌套 CASE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31312214/

相关文章:

sql - 如何获取每对列的计数和最新记录?

mysql - ORM:仅当表B中存在id时才从表A中选择

php - 存储过程不返回数据

c# - 将字符串值传递给 sql server

sql - 工作日SQL查询

sql-server - IN (NULL) 是否始终不返回任何行?

SQL Server 存储过程的含义

php - 议程中可用时间的算法

sql-server - 如何在运行时确定我是否已连接到生产数据库?

sql-server-2005 - 在SQL Server中,如何对实例中的所有数据库执行一段tsql?