Evaluate a Column with SELECT CASE in mySQL and Returns 三列作为结果

Evaluate a Column with SELECT CASE in mySQL and Returns three columns as Result

您好,我有一个 mySQL Table 包含这五个列

1) 验证STS 2) Comprobante_Tipo_Comprobante 3) Comprobante_Subtotal 4) Impuesto_Trasladado 5) Comprobante_Total

因此,我需要先评估 ValidationSTS,当等于 "Cancelado" 时,然后乘以零,以获得零作为结果 Case Else 然后传递给嵌套的 SELECT CASE.

在嵌套的 SELECT CASE 中,我评估 "Comprobante_Tipo_Comprobante",然后评估两个案例:"ingreso" 和 "egreso"。 当 Case 等于 "ingreso" 时,结果将是列 "Comprobante_Subtotal" 当大小写等于 "egreso" 时,结果将是 "Comprobante_Subtotal" 列的负数。

这就是我的代码,return一列作为结果:

SELECT
CASE ValidationSts WHEN 'Cancelado' THEN 0*Comprobante_Subtotal 
ELSE 
CASE WHEN Comprobante_Tipo_de_Comprobante = 'egreso' THEN -1*Comprobante_Subtotal WHEN Comprobante_Tipo_de_Comprobante='ingreso' THEN Comprobante_Subtotal END 
END 
FROM facturas_recibidas WHERE Receptor_RFC= 'RFC' AND Emisor_RFC='RFCList' AND Comprobante_Fecha BETWEEN 'srchFechaInicial.SQLDate + " 00:00:00.000' AND 
srchFechaFinal.SQLDate + " 23:59.59.997'
ORDER BY Comprobante_Fecha ASC"

如我所说,它有效,但只能 return 一列作为结果。

但是如果我想 return 三列呢? 例如:Comprobante_Subtotal、Impuesto 和 Comprobante_Total 并应用与 Comprobante_subtotal.

相同的处理

我试过用 AND,用逗号分隔不成功。 :(

有什么线索吗? 此致

CASE 不能导致每行有一个以上的字段值(列);您必须为每一列重现您的逻辑。另一种方法是让你的逻辑只执行一次,而是让它产生一个 "handling" 代码,可以在包装查询中用于更简单的逻辑。

看起来对于您的场景,"handling" 代码只是您想使用的乘数 (-1, 0, 1)。


SELECT @multi := 
   CASE WHEN ValidationSts = 'Cancelado' THEN 0
      WHEN Comprobante_Tipo_de_Comprobante = 'egreso' THEN -1 
      WHEN Comprobante_Tipo_de_Comprobante='ingreso' THEN 1
   END AS multi
   , Comprobante_Subtotal * @multi
   , Impuesto * @multi
   , Comprobante_Total * @multi
FROM facturas_recibidas 
WHERE Receptor_RFC= 'RFC' 
   AND Emisor_RFC='RFCList' 
   AND Comprobante_Fecha BETWEEN [startDatetime] AND [endDatetime]
ORDER BY Comprobante_Fecha ASC;

注意:上面的版本利用会话变量 (@multi) 来避免对子查询的需要。在这种情况下,应该没问题;但是有些人不喜欢他们,或者觉得他们不可靠。如果其中任何一个适用,则可以在没有会话变量的情况下使用它。

SELECT Comprobante_Subtotal * multi
   , Impuesto * multi
   , Comprobante_Total * multi
FROM (
   SELECT 
      CASE WHEN ValidationSts = 'Cancelado' THEN 0
         WHEN Comprobante_Tipo_de_Comprobante = 'egreso' THEN -1 
         WHEN Comprobante_Tipo_de_Comprobante='ingreso' THEN 1
      END AS multi
      , Comprobante_Subtotal, Impuesto, Comprobante_Total
      , Comprobante_Fecha /* subqueries can't guarantee ordering, so this is needed so the outer query can do the final ordering */ 
   FROM facturas_recibidas 
   WHERE Receptor_RFC= 'RFC' 
      AND Emisor_RFC='RFCList' 
      AND Comprobante_Fecha BETWEEN [startDatetime] AND [endDatetime]
) AS subQ
ORDER BY Comprobante_Fecha ASC;

作为旁注,我应该指出我摆脱了嵌套的 CASE 逻辑;使用 CASE WHEN [condition1] THEN X WHEN [condition2] THEN .... 版本而不是 CASE [switching value] WHEN [value1] THEN X WHEN [value2] THEN .... 使得嵌套变得不必要。