Somar valores da coluna criada no PIVOT

SQL

MySQL

Banco de Dados

Oracle PL SQL

30/12/2020

Bom, nessa query eu tenho que listar os produtos que saíram para consumo em um determinado período, e o quanto foi consumido de cada produto. Tenho o cód do produto, nome, data da movimentação, a quantidade que foi consumida e a quantidade em estoque (somatória de todos os estoques). Porém existe algumas considerações.. existem 2 tipos de saída de produto, a saída para paciente que é (P) e saída para setor que é (S), e isso encontra-se em tp_mvto_estoque. O (c) e (d) é devolução, uma de setor e outra de paciente.. O estoque atual já é a soma dos produtos em todos os estoques.. Porém preciso somar as duas saídas que são S e P e subtrair pela soma das devoluções que são C e D.. S+P-C+D, Tentei realizar um pivot para listar em colunas para realizar a soma e subtração mas sem sucesso, não consigo adicionar as colunas do pivot no select para realizar essas operações. Se tiver uma forma de fazer ou outra melhor, Agradeço. O banco de dados é ORACLE.

Saída do select: https://imgur.com/wsUYobj

SELECT
FROM

(

SELECT

TB1.CD_PRODUTO, TB1.DS_PRODUTO, TB1.TP_MVTO_ESTOQUE, TB1.QT_MOVIMENTACAO, TB1.DATA, TB1.ESTOQUE_ATUAL

FROM

(

SELECT

ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, MVT.TP_MVTO_ESTOQUE, ITMVT.QT_MOVIMENTACAO, To_Char(ITMVT.DH_MVTO_ESTOQUE,'MM') AS DATA, Sum(EP.QT_ESTOQUE_ATUAL) AS ESTOQUE_ATUAL

FROM

ITMVTO_ESTOQUE ITMVT, PRODUTO PROD, MVTO_ESTOQUE MVT, EST_PRO EP

WHERE

ITMVT.DH_MVTO_ESTOQUE BETWEEN To_Date ('19/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss') AND To_Date ('26/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss') AND PROD.CD_PRODUTO = ITMVT.CD_PRODUTO AND PROD.CD_ESPECIE = 1 AND ITMVT.CD_MVTO_ESTOQUE = MVT.CD_MVTO_ESTOQUE AND MVT.TP_MVTO_ESTOQUE IN ('S','P','C','D') AND EP.CD_PRODUTO = ITMVT.CD_PRODUTO

GROUP BY ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, ITMVT.QT_MOVIMENTACAO, ITMVT.DH_MVTO_ESTOQUE, MVT.TP_MVTO_ESTOQUE

ORDER BY ITMVT.CD_PRODUTO

)TB1

ORDER BY TB1.CD_PRODUTO

)TB2

PIVOT (Sum(QT_MOVIMENTACAO) FOR TP_MVTO_ESTOQUE IN ('S','P','C','D'))
  
  ORDER BY 

  CD_PRODUTO
Marcus Vinícius

Marcus Vinícius

Curtidas 0

Melhor post

Emerson Nascimento

Emerson Nascimento

30/12/2020

deve ser algo assim:
	SELECT
		TB1.CD_PRODUTO, TB1.DS_PRODUTO, TB1.TP_MVTO_ESTOQUE, TB1.SAIDAS, TB1.DEVOLUCOES, TB1.DATA, TB1.ESTOQUE_ATUAL
	FROM
	(
		SELECT
			ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, MVT.TP_MVTO_ESTOQUE, 
			SUM(CASE WHEN MVT.TP_MVTO_ESTOQUE IN ('S','P') THEN ITMVT.QT_MOVIMENTACAO ELSE 0 END) SAIDAS,
			SUM(CASE WHEN MVT.TP_MVTO_ESTOQUE IN ('C','D') THEN ITMVT.QT_MOVIMENTACAO ELSE 0 END) DEVOLUCOES,
			To_Char(ITMVT.DH_MVTO_ESTOQUE,'MM') AS DATA, EP.QT_ESTOQUE_ATUAL AS ESTOQUE_ATUAL
		FROM
			ITMVTO_ESTOQUE ITMVT
		INNER JOIN
			PRODUTO PROD ON PROD.CD_PRODUTO = ITMVT.CD_PRODUTO
			AND PROD.CD_ESPECIE = 1
		INNER JOIN
			MVTO_ESTOQUE MVT ON MVT.CD_MVTO_ESTOQUE = ITMVT.CD_MVTO_ESTOQUE
			AND MVT.TP_MVTO_ESTOQUE IN ('S','P','C','D')
		INNER JOIN
			EST_PRO EP ON EP.CD_PRODUTO = ITMVT.CD_PRODUTO
		WHERE
			ITMVT.DH_MVTO_ESTOQUE BETWEEN To_Date ('19/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss') AND To_Date ('26/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss')
		GROUP BY
			ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, ITMVT.DH_MVTO_ESTOQUE, EP.QT_ESTOQUE_ATUAL
	) TB1
você só precisa resolver o que realmente quer apresentar e, caso necessário, corrigir o agrupamento.
GOSTEI 1

Mais Respostas

Marcus Vinícius

Marcus Vinícius

30/12/2020

deve ser algo assim: Valeu mesmo cara, vou testar agora mesmo, deu uma olhada mais a fundo na sintaxe do pivot e consegui desenrolar.. porém agora com divergências na soma do estoque, vou dar uma olhada e qualquer coisa retorno aqui
	SELECT
		TB1.CD_PRODUTO, TB1.DS_PRODUTO, TB1.TP_MVTO_ESTOQUE, TB1.SAIDAS, TB1.DEVOLUCOES, TB1.DATA, TB1.ESTOQUE_ATUAL
	FROM
	(
		SELECT
			ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, MVT.TP_MVTO_ESTOQUE, 
			SUM(CASE WHEN MVT.TP_MVTO_ESTOQUE IN ('S','P') THEN ITMVT.QT_MOVIMENTACAO ELSE 0 END) SAIDAS,
			SUM(CASE WHEN MVT.TP_MVTO_ESTOQUE IN ('C','D') THEN ITMVT.QT_MOVIMENTACAO ELSE 0 END) DEVOLUCOES,
			To_Char(ITMVT.DH_MVTO_ESTOQUE,'MM') AS DATA, EP.QT_ESTOQUE_ATUAL AS ESTOQUE_ATUAL
		FROM
			ITMVTO_ESTOQUE ITMVT
		INNER JOIN
			PRODUTO PROD ON PROD.CD_PRODUTO = ITMVT.CD_PRODUTO
			AND PROD.CD_ESPECIE = 1
		INNER JOIN
			MVTO_ESTOQUE MVT ON MVT.CD_MVTO_ESTOQUE = ITMVT.CD_MVTO_ESTOQUE
			AND MVT.TP_MVTO_ESTOQUE IN ('S','P','C','D')
		INNER JOIN
			EST_PRO EP ON EP.CD_PRODUTO = ITMVT.CD_PRODUTO
		WHERE
			ITMVT.DH_MVTO_ESTOQUE BETWEEN To_Date ('19/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss') AND To_Date ('26/12/2020 23:59:59','DD/MM/YYYY hh24:mi:ss')
		GROUP BY
			ITMVT.CD_PRODUTO, PROD.DS_PRODUTO, ITMVT.DH_MVTO_ESTOQUE, EP.QT_ESTOQUE_ATUAL
	) TB1
você só precisa resolver o que realmente quer apresentar e, caso necessário, corrigir o agrupamento.
GOSTEI 0
POSTAR