Fórum Somar valores da coluna criada no PIVOT #613674
30/12/2020
0
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
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
Curtir tópico
+ 0
Responder
Post mais votado
30/12/2020
deve ser algo assim:
você só precisa resolver o que realmente quer apresentar e, caso necessário, corrigir o agrupamento.
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
Emerson Nascimento
Responder
Gostei + 1
Mais Posts
30/12/2020
Marcus Vinícius
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
você só precisa resolver o que realmente quer apresentar e, caso necessário, corrigir o agrupamento.
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
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)