2017-04-07 66 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 ....使嵌套不必要。