2015-06-23 29 views
0

我有這個疑問:由不存在的列組或不包含sql server 2012子句中的空值?

SELECT 1 as Tipo, 'Total Efectivo' 
    AS tipo_pago, 
    ISNULL(SUM(p.monto), 0) AS Total, 
    suc.su_nombre AS Sucursal 
    FROM Comprobante c 
    RIGHT JOIN Pago p ON c.co_idcomp = p.co_idcomp 
    LEFT JOIN PagoCheque pc ON p.id_pago = pc.id_pago 
    LEFT JOIN Cheque ch ON pc.id_cheque = ch.id_cheque 
    LEFT JOIN PagoBoletaDeposito pbd ON p.id_pago = pbd.id_pago 
    LEFT JOIN BoletaDeposito bd ON pbd.id_boleta_deposito = bd.id_boleta_deposito 
    LEFT JOIN Movimientos m ON p.mv_id = m.mv_id 
    LEFT JOIN Sorteos s ON m.so_id = s.so_id 
    LEFT JOIN Clientes cl ON m.cl_id = cl.cl_id 
    LEFT JOIN Sucursales suc ON m.su_id = suc.su_id 
    WHERE p.esta_eliminado = 0 AND p.tipo_pago = 1 AND m.cl_id = 14 AND m.su_id = 1 
    GROUP BY suc.su_nombre 
    UNION 
    SELECT 2 as Tipo, 'Total Premios' 
    AS tipo_pago, 
    ISNULL(SUM(p.monto), 0) AS Total, 
    suc.su_nombre AS Sucursal 
    FROM Comprobante c 
    RIGHT JOIN Pago p ON c.co_idcomp = p.co_idcomp 
    LEFT JOIN PagoCheque pc ON p.id_pago = pc.id_pago 
    LEFT JOIN Cheque ch ON pc.id_cheque = ch.id_cheque 
    LEFT JOIN PagoBoletaDeposito pbd ON p.id_pago = pbd.id_pago 
    LEFT JOIN BoletaDeposito bd ON pbd.id_boleta_deposito = bd.id_boleta_deposito 
    LEFT JOIN Movimientos m ON p.mv_id = m.mv_id 
    LEFT JOIN Sorteos s ON m.so_id = s.so_id 
    LEFT JOIN Clientes cl ON m.cl_id = cl.cl_id 
    LEFT JOIN Sucursales suc ON m.su_id = suc.su_id 
    WHERE p.esta_eliminado = 0 AND p.tipo_pago = 2 AND m.cl_id = 14 AND m.su_id = 1 
    GROUP BY suc.su_nombre 
UNION 
SELECT 5 as Tipo, 'Total General' AS tipo_pago, 
     ISNULL(SUM(p.monto), 0) AS Total, 
     suc.su_nombre AS Sucursal 
FROM Comprobante c 
RIGHT JOIN Pago p ON c.co_idcomp = p.co_idcomp 
LEFT JOIN PagoCheque pc ON p.id_pago = pc.id_pago 
LEFT JOIN Cheque ch ON pc.id_cheque = ch.id_cheque 
LEFT JOIN PagoBoletaDeposito pbd ON p.id_pago = pbd.id_pago 
LEFT JOIN BoletaDeposito bd ON pbd.id_boleta_deposito = bd.id_boleta_deposito 
LEFT JOIN Movimientos m ON p.mv_id = m.mv_id 
LEFT JOIN Sorteos s ON m.so_id = s.so_id 
LEFT JOIN Clientes cl ON m.cl_id = cl.cl_id 
LEFT JOIN Sucursales suc ON m.su_id = suc.su_id 
WHERE p.esta_eliminado = 0 AND m.cl_id = 14 AND m.su_id = 1 
GROUP BY suc.su_nombre 

我的問題是,如果有第二工會沒有價值,那麼結果沒有顯示,但我想包括他們,即使他們是空的。 但我不能GROUP BY欄目tipo_pago,因爲它給了我一個錯誤。

有沒有可能包含這個值?

更新:看到我需要澄清的答案,我不能使一個單一的查詢,我需要維護聯合和兩個查詢。

更新2:給我錯誤的查詢是我的錯,我錯過了查詢的重要部分與實現。有第三個UNION使得所有的tipo_pago的總和爲

+0

爲什麼它是工會而不是工會全部?根據定義不能有重複,所以這只是額外的工作。另外爲什麼'c右加入左加入pc'而不是'p左加入c左加入pc'?正確的連接是徹頭徹尾的不直觀的,讓人們在嘗試閱讀你的查詢時會更加困難。最後,在where子句中引用'm'使得它成爲內連接,而不是左連接。 –

+0

爲什麼如果功能上不必要和效率低下,你必須使用聯盟?即使沒有其他數據,我的答案也會爲您提供tipo_pago值(1和2)的記錄。 –

+0

我編輯了我的答案,給你最後的總排。 –

回答

3

爲什麼不只是做這個作爲一個單一的查詢?像這樣的東西應該接近。

SELECT p.tipo_pago as Tipo 
    , case p.tipo_pago when 1 then 'Total Efectivo' else 'Total Premios' end AS tipo_pago 
    , ISNULL(SUM(p.monto), 0) AS Total 
    , suc.su_nombre AS Sucursal 
FROM Comprobante c 
RIGHT JOIN Pago p ON c.co_idcomp = p.co_idcomp 
LEFT JOIN PagoCheque pc ON p.id_pago = pc.id_pago 
LEFT JOIN Cheque ch ON pc.id_cheque = ch.id_cheque 
LEFT JOIN PagoBoletaDeposito pbd ON p.id_pago = pbd.id_pago 
LEFT JOIN BoletaDeposito bd ON pbd.id_boleta_deposito = bd.id_boleta_deposito 
LEFT JOIN Movimientos m ON p.mv_id = m.mv_id 
LEFT JOIN Sorteos s ON m.so_id = s.so_id 
LEFT JOIN Clientes cl ON m.cl_id = cl.cl_id 
LEFT JOIN Sucursales suc ON m.su_id = suc.su_id 
WHERE p.esta_eliminado = 0 
    AND p.tipo_pago in (1, 2) 
    AND m.cl_id = 14 
    AND m.su_id = 1 
GROUP BY p.tipo_pago 
    , suc.su_nombre 
ORDER BY p.tipo_pago 
+0

,因爲列的tipo_pago不是存在的列 –

+1

Huh ???它如何不敏感?你在查詢中就有它。您在where子句中引用該列,但您也有一個具有相同名稱的派生列。 –

+0

你完全正確,我的錯誤...我會檢查你的查詢 –

0

您可以在from子句中添加一個values語句以確保您同時獲得了tipo_pago的兩個值。您可以使用分組集合來獲得最終的總排。如:

SELECT isnull(a.pago, 5) as Tipo, 
    case when a.pago=1 then 
     'Total Efectivo' 
    when a.pago=2 then 
     'Total Premios' 
    else 
     'Total General' 
    end AS tipo_pago, 
    ISNULL(SUM(p.monto), 0) AS Total, 
    suc.su_nombre AS Sucursal 
from (values (1),(2)) a(pago) 
LEFT JOIN Pago p on a.pago = p.tipo_pago 
LEFT JOIN Comprobante c ON c.co_idcomp = p.co_idcomp 
LEFT JOIN PagoCheque pc ON p.id_pago = pc.id_pago 
LEFT JOIN Cheque ch ON pc.id_cheque = ch.id_cheque 
LEFT JOIN PagoBoletaDeposito pbd ON p.id_pago = pbd.id_pago 
LEFT JOIN BoletaDeposito bd ON pbd.id_boleta_deposito = bd.id_boleta_deposito 
LEFT JOIN Movimientos m ON p.mv_id = m.mv_id 
LEFT JOIN Sorteos s ON m.so_id = s.so_id 
LEFT JOIN Clientes cl ON m.cl_id = cl.cl_id 
LEFT JOIN Sucursales suc ON m.su_id = suc.su_id 
WHERE p.esta_eliminado = 0 AND m.cl_id = 14 AND m.su_id = 1 
group by grouping sets ((a.pago, suc.su_nombre),()) 
相關問題