在mySQL中使用SELECT CASE评估列并返回三列作为结果

时间:2017-04-07 19:53:20

标签: mysql select case multiple-columns

您好我有一个包含这五列的mySQL表

1)ValidationSTS 2)Comprobante_Tipo_Comprobante 3)Comprobante_Subtotal 4)Impuesto_Trasladado 5)Comprobante_Total

所以,我需要首先评估ValidationSTS,当等于" Cancelado",然后乘以零,以便得到零作为结果 Case Else然后传递给嵌套的SELECT CASE。

在嵌套的SELECT CASE I eval" Comprobante_Tipo_Comprobante"中,然后评估两种情况:" ingreso"和" egreso"。 当Case等于" ingreso"时,结果将是" Comprobante_Subtotal" 当Case等于" egreso"时,结果将是" Comprobante_Subtotal"否定。

这样我的代码就会返回一列作为结果:



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"




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

但是如果我想要返回三列呢? 例如:Comprobante_Subtotal,Impuesto和Comprobante_Total,并应用与Comprobante_subtotal相同的处理。

我尝试使用AND,并且用逗号分割失败。 :(

任何线索? 此致

1 个答案:

答案 0 :(得分:0)

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

对于您的场景,"处理"代码只是你想要使用的乘数(-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 ....会使嵌套变得不必要。