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 ....
使得嵌套变得不必要。
您好,我有一个 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 ....
使得嵌套变得不必要。