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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
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

Responder

Post mais votado

30/12/2020

deve ser algo assim:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.

Emerson Nascimento

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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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.

Ler Mais...

Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar