Multiple Joins to add different values of the same column

Asked

Viewed 84 times

1

I’m having problems in a query (Firebird) with several Selects for the same Stored Procedure (SP_PRODUTO_MOVIMENTO), with practically the same parameters, differing only in the values of a column (COD_DOCUMENTO_TIPO), that "categorizes" the data. These data should generate some sums.

I believe that for better efficiency, I should unify the select a SP_PRODUTO_MOVIMENTO to only one Join, but I can’t think of a way to do that by keeping the SUM operations of the select distinct according to the values of COD_DOCUMENTO_TIPO.


SELECT P.COD_PRODUTO, P.NOME, PF.STATUS, PEI.STOCK AS SALDO_INICIAL, PM.QTD_ENTRADA AS QTD_COMPRADA, SUM(VI.QUANTITY) AS QTD_VENDIDA_NFE, SUM(PMR.QTD_ENTRADA) AS QTD_VENDIDA_RETAGUARDA, SUM(PMDC.QTD_ENTRADA) AS DEV_COMPRA, SUM(PMDV.QTD_ENTRADA) AS DEV_VENDA, SUM(PMP.QTD_ENTRADA) THE LOSSES, PEF.STOCK AS SALDO_FINAL

-- PRODUCT FROM PRODUCT AS P

-- SALE JOIN SP_VENDA_ITENS(,'Where cod_company = AND DATA_VENDA >='' AND DATA_VENDA <= ''') AS VI ON P.COD_PRODUTO = VI.COD_PRODUTO

-- SUBSIDIARY PRODUCT LEFT JOIN PRODUTO_FILIAL AS PF ON PF.COD_PRODUTO = P.COD_PRODUTO AND PF.COD_EMPRESA=

-- BUYING LEFT JOIN SP_PRODUTO_MOVIMENTO(,,' WHERE COD_EMPRESA = AND ORIGIN='INVOICE'' AND COD_DOCUMENTO_TIPO in (1,2,3,5,8,11,13,21,32,43)') AS PM ON PM.COD_PRODUTO = P.COD_PRODUTO

-- RETARGUARDA LEFT JOIN SP_PRODUTO_MOVIMENTO(,,' WHERE COD_EMPRESA = AND ORIGIN='INVOICE'' AND COD_DOCUMENTO_TIPO IN (16,27,28,30,36,39,40,41,42,45)') PMR ON PMR.COD_PRODUTO = P.COD_PRODUTO

-- DEVOLUCAO COMPRA LEFT JOIN SP_PRODUTO_MOVIMENTO(,,' WHERE COD_EMPRESA = AND ORIGIN='INVOICE'' AND COD_DOCUMENTO_TIPO IN (9,10,37)') AS PMDC ON PMDC.COD_PRODUTO = P.COD_PRODUTO

-- DEVOLUCAO VENDA LEFT JOIN SP_PRODUTO_MOVIMENTO(,,' WHERE COD_EMPRESA = AND ORIGIN='INVOICE'' AND COD_DOCUMENTO_TIPO IN (12)') AS PMDV ON PMDV.COD_PRODUTO = P.COD_PRODUTO

-- LOSS LEFT JOIN SP_PRODUTO_MOVIMENTO(,,' WHERE COD_EMPRESA = AND ORIGIN='INVOICE'' AND COD_DOCUMENTO_TIPO IN (22)') AS PMP ON PMP.COD_PRODUTO = P.COD_PRODUTO

-- INITIAL STOCK JOIN posicao_stock(,CAST( AS DATE)-1,99,null,’S','N',null,'') AS PEI ON PEI.COD_PRODUTO = P.COD_PRODUTO

-- FINAL STOCK JOIN posicao_stock(,99,null,’S','N',null,'') AS PEF ON PEF.COD_PRODUTO = P.COD_PRODUTO GROUP BY P.COD_PRODUTO, P.NOME, PF.STATUS, PEF.STOCK, PEI.STOCK,PM.QTD_ENTRADA


They could help me with the understanding of a logic for better the efficiency of this consultation?

  • I don’t understand very well but you have already considered the possibility of recovering all the products and making the various sums through CASE/WHEN for each condition?

  • I do not know if I understood well, as it would be this "recovery of the products?"

  • All these conditions you pass to SP_PRODUTO_MOVIMENTO would put as condition in CASE/WHEN. Idem posica_stock.

  • I tested on one condition, but had conversion error. (GDS Exception. 335544334. Conversion error from string "43") &#xA;&#xA;----------------------------------------------------------------------------------------------------------&#xA;&#xA;SELECT P.COD_PRODUTO, P.NOME, PF.STATUS,&#xA;CASE PM.COD_DOCUMENTO_TIPO&#xA;WHEN (COD_DOCUMENTO_TIPO IN (1,2,3,5,8,11,13,21,32,43)) THEN PM.QTD_ENTRADA&#xA;END AS PP, SUM(VI.QUANTITY) AS QTD_VENDIDA_NFE

  • I don’t think this CASE is syntactically correct. See the documentation.

  • Try: CASE WHEN PM.COD_DOCUMENTO_TIPO IN (1,2,3,5,8,11,13,21,32,43) THEN PM.QTD_ENTRADA ELSE 0 END AS PP, .

Show 1 more comment
No answers

Browser other questions tagged

You are not signed in. Login or sign up in order to post.