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?
– anonimo
I do not know if I understood well, as it would be this "recovery of the products?"
– André Portella
All these conditions you pass to SP_PRODUTO_MOVIMENTO would put as condition in CASE/WHEN. Idem posica_stock.
– anonimo
I tested on one condition, but had conversion error. (GDS Exception. 335544334. Conversion error from string "43") 

----------------------------------------------------------------------------------------------------------

SELECT P.COD_PRODUTO, P.NOME, PF.STATUS,
CASE PM.COD_DOCUMENTO_TIPO
WHEN (COD_DOCUMENTO_TIPO IN (1,2,3,5,8,11,13,21,32,43)) THEN PM.QTD_ENTRADA
END AS PP, SUM(VI.QUANTITY) AS QTD_VENDIDA_NFE
– André Portella
I don’t think this CASE is syntactically correct. See the documentation.
– anonimo
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,
.– anonimo