2016-12-05 16 views
1

Операция sum вызывается в моем запросе более одного раза, и результат, который появляется в столбце B2_ESTOQUE, становится непоследовательным, возможно, причиной этого является количество записей, возвращающихся в операции select и left join. Это предположение.Операция дублирования суммы

Есть ошибки в запросе ниже? Используется ли операция левого соединения неправильно?

SELECT 
    SB1.B1_FILIAL, SB1.B1_COD, SB1.B1_DESC, SB1.B1_TIPO, SB1.B1_UM, SB1.B1_SEGUM, SB1.B1_GRUPO, SB1.B1_CONV, SB1.B1_TIPCONV, SB1.B1_PRV1, 
    SB1.B1_PESO, SB1.B1_CODBAR, SB1.B1_QE, SB1.B1_MSBLQL, SB1.D_E_L_E_T_, SB1.R_E_C_N_O_, SB1.MD5, SB1.DATA_UPDATE, 
     (SELECT BM_DESC FROM PADRAO.PORTAL_SBM001 WHERE BM_GRUPO = SB1.B1_GRUPO LIMIT 0,1) as B1_GRUPO_DESCRICAO, 
    (SUM(IFNULL(SB2.B2_QATU, 0)) - SUM(IFNULL(SB2.B2_RESERVA, 0)) - SUM(IFNULL(SB2.B2_QPEDVEN, 0))) - SUM(IFNULL(SC6.C6_QTDVEN, 0)) AS B2_ESTOQUE 
    FROM PADRAO.PORTAL_SB1001 SB1 
    LEFT JOIN PADRAO.PORTAL_SB2001 SB2 
    ON SB1.B1_COD = SB2.B2_COD 
    LEFT JOIN PADRAO.PORTAL_SC6001_NEW SC6 
    ON SB1.B1_COD = SC6.C6_PRODUTO 
AND (SC6.C6_NUM IS NULL OR SC6.C6_NUM = '') 
    AND SB2.B2_LOCAL IN ('07','08') 
    WHERE (SB1.D_E_L_E_T_ IS NULL OR SB1.D_E_L_E_T_ = '') 
    AND (SB2.D_E_L_E_T_ IS NULL OR SB2.D_E_L_E_T_ = '') 
    AND (SC6.D_E_L_E_T_ IS NULL OR SC6.D_E_L_E_T_ = '') 
    AND (SB1.B1_MSBLQL IS NULL OR SB1.B1_MSBLQL <> '1') 
    GROUP BY SB1.B1_COD; 
+0

если есть связь 1-М между SB1 и SC6, тогда SB2 искусственно раздувается. Вы должны использовать СУММУ SB2 перед объединением, используя встроенное представление. – xQbert

+0

Можете ли вы привести мне пример? –

ответ

2

Я не был уверен, что все проверки для isnull и '' были в предложениях where. Я использовал coalesce для изменения null в пустую строку и исключил значения в подзапросах where where, а не в самом внешнем where where; но, возможно, вы хотели сохранить левые соединения Nulls, поэтому вы проверили, что вы опорожняете строку и null ...

Тем не менее, вот что я имею в качестве запроса UNTESTED. Обратите внимание: я преобразовал две левые таблицы, чтобы суммировать значения до объединения и группы с помощью соединенных ключей.

SELECT 
    SB1.B1_FILIAL 
    , SB1.B1_COD 
    , SB1.B1_DESC 
    , SB1.B1_TIPO 
    , SB1.B1_UM 
    , SB1.B1_SEGUM 
    , SB1.B1_GRUPO 
    , SB1.B1_CONV 
    , SB1.B1_TIPCONV 
    , SB1.B1_PRV1 
    , SB1.B1_PESO 
    , SB1.B1_CODBAR 
    , SB1.B1_QE 
    , SB1.B1_MSBLQL 
    , SB1.D_E_L_E_T_ 
    , SB1.R_E_C_N_O_ 
    , SB1.MD5 
    , SB1.DATA_UPDATE 
    ,(SELECT BM_DESC FROM PADRAO.PORTAL_SBM001 WHERE BM_GRUPO = SB1.B1_GRUPO LIMIT 0,1) as B1_GRUPO_DESCRICAO 
    , SB2.mSum - SB6.mSUM as B2_ESTOQUE 

    FROM PADRAO.PORTAL_SB1001 SB1 

    LEFT JOIN (SELECT SB2.B2_COD, SUM(IFNULL(B2_QATU, 0) - IFNULL(B2_RESERVA, 0) - IFNULL(B2_QPEDVEN, 0)), AS mSum 
       FROM PADRAO.PORTAL_SB2001 
       WHERE B2_LOCAL IN ('07','08') 
       AND coalesce(SB2.D_E_L_E_T_,'')='' 
       GROUP BY SB2.B2_COD) SB2 
     ON SB1.B1_COD = SB2.B2_COD 


    LEFT JOIN (SELECT SUM(IFNULL(SC6.C6_QTDVEN, 0)) mSUM, C6_PRODUTO 
       FROM PADRAO.PORTAL_SC6001_NEW SC6 
       WHERE coalesce(SC6.C6_NUM,'') = '' 
       AND coalesce(SC6.D_E_L_E_T_,'') = '' 
       GROUP BY C6_PRODUTO) 
     ON SB1.B1_COD = SC6.C6_PRODUTO 

    WHERE (SB1.D_E_L_E_T_ IS NULL OR SB1.D_E_L_E_T_ = '') 
     AND (SB1.B1_MSBLQL IS NULL OR SB1.B1_MSBLQL <> '1') 

    GROUP BY SB1.B1_COD; 
+0

Отлично! Это решило мои потребности. –

+0

Можете ли вы проголосовать за мой вопрос? –