您好我有一个包含这五列的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,并且用逗号分割失败。 :(
任何线索? 此致
答案 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 ....
会使嵌套变得不必要。