2017-04-07 65 views
0

您好我有一个MySQL表与这些五列评估与mySQL的SELECT CASE色谱柱并返回三列作为结果

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

我不是英国本地人,我是一个像你一样的拉丁人。但我只想说恕我直言,西班牙语单词的字段和变量名称的使用不会帮助其他非拉丁语在您的代码中找到含义。所以,即使这个问题可以很好,你也可以得到一些好的答案。 – dparoli

回答

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 WHEN [condition1] THEN X WHEN [condition2] THEN ....版本而不是CASE [switching value] WHEN [value1] THEN X WHEN [value2] THEN ....使嵌套不必要。