Bom dia pessoal preciso fazer um relatório onde apresenta as entradas e saidas de produtos e matéria-prima. Na tabela as entradas e saidas ficam na mesma coluna, o que difere é uma segunda coluna onde determina o tipo. Consigo trazer a lista de itens com as saidas, mas nao estou conseguindo trazer as entradas junto.
Alguém pode me dar um auxilio? estou aprendendo sql ainda.
Abaixo segue exemplo.
** tipos de movimento **
L - saida
P - entrada
C - saida
A - entrada
B - saida
E - entrada
SELECT
e1.cd_material,
SUM(e1.quantidade) AS saidas
FROM
esmovime e1
WHERE
(e1.cd_esp_estoque = 'L' OR e1.cd_esp_estoque = 'C' OR e1.cd_esp_estoque = 'B')
AND e1.dt_movimento = '2019-02-14'
GROUP BY
e1.cd_material
Preciso adicionar a coluna com a soma das entradas que sao tipos P, A e E
Se vc quer retornar a soma das quantidades de entradas:
SELECT
e1.cd_esp_estoque AS tipoMovimento,
SUM(e1.quantidade) AS saidas
FROM
esmovime e1
WHERE
e1.cd_esp_estoque IN ('P', 'A', 'E')
AND e1.dt_movimento = '2019-02-14'
GROUP BY
e1.cd_esp_estoque
Particularmente, não gosto desta abordagem. É de difícil manutenção.
A melhor opção, no meu ponto de vista, é fazer um select que traga tudo e tratar no código, infelizmente.
Veja se funciona, já fiz algo semelhante no oracle e funcionou:
SELECT
m.tipo as tipoMovimento,
SUM(m.quantidade) AS quantidade
FROM
(
SELECT 'entradas' AS tipo, e.quantidade AS quantidade, e.dt_movimento FROM esmovime e WHERE e.cd_esp_estoque IN ('P', 'A', 'E')
UNION
SELECT 'saidas' AS tipo, s.quantidade AS quantidade, s.dt_movimento FROM esmovime s WHERE s.cd_esp_estoque IN ('L', 'C', 'B')
) m
WHERE
m.dt_movimento = '2019-02-14'
GROUP BY
m.tipo
Pow mano, manda ai como ficou. Queria ver, ainda mais depois da ajuda uai. =)
Tinha montado essa query aqui:
SELECT
m.cd_material as material,
e.quantidade AS "entradas",
s.quantidade AS "saidas"
FROM
esmovime m
LEFT JOIN (
SELECT e.cd_material, SUM(e.quantidade) AS quantidade
FROM esmovime e
WHERE e.cd_material = m.cd_material
AND e.cd_esp_estoque IN ('P', 'A', 'E')
) e ON e.cd_material = m.cd_material
LEFT JOIN (
SELECT s.cd_material, SUM(s.quantidade) AS quantidade
FROM esmovime s
WHERE s.cd_material = m.cd_material
AND s.cd_esp_estoque IN ('L', 'C', 'B')
) s ON s.cd_material = m.cd_material
WHERE
m.dt_movimento = '2019-02-14'
kkk, to mais perdido que bolacha em boca de véio… fiz assim:
1. * SELECT
2. * m.Cd_material as material,
3. * SUM(m.entradas) AS entradas, SUM(m.saidas) AS saidas
4. * FROM
5. * (
6. * SELECT 'entradas' AS tipo, e.Cd_material, e.quantidade AS entradas, e.dt_movimento FROM esmovime e WHERE e.cd_esp_estoque IN ('P', 'A', 'E')
7. * UNION
8. * SELECT 'saidas' AS tipo, s.Cd_material, s.quantidade AS saidas, s.dt_movimento FROM esmovime s WHERE s.cd_esp_estoque IN ('L', 'C', 'B')
9. * ) m
10. * WHERE
11. * m.dt_movimento = '2019-02-14'
12. * GROUP BY
13. * m.tipo, m.Cd_material order by Cd_material asc
Esse erro eh pq os 2 selects tem q ter as mesmas colunas, e da forma como vc colocou, um retorna o alis “entradas” e o outro retorna “saidas”.
Mas eu acho q o select q montei retorna do jeito q vc precisa viu (bom, pelo menos pelo que entendi). Até coloquei o exemplo do retorno, dá uma olhada pra ver se eh isso msm)
A melhor solução é adaptar a sugestão do @Lucas_Camara
Provavelmente, usando OUTER LEFT.
Fiz algo nesse sentido há quase 10 anos atrás… Precisava de uma query que retornasse registros em que a mesma coluna tivesse valores diferentes…
SELECT
m.cd_material AS material,
e.quantidade AS "entradas",
s.quantidade AS "saidas"
FROM
esmovime m
LEFT JOIN (
SELECT e.cd_material as material, SUM(e.quantidade) AS quantidade
FROM esmovime e
WHERE e.cd_material = m.cd_material
AND e.cd_esp_estoque IN ('P', 'A', 'E')
GROUP BY e.cd_material
) e ON e.material = m.cd_material
LEFT JOIN (
SELECT s.cd_material as material, SUM(s.quantidade) AS quantidade
FROM esmovime s
WHERE s.cd_material = m.cd_material
AND s.cd_esp_estoque IN ('L', 'C', 'B')
GROUP BY s.cd_material
) s ON s.material = m.cd_material
WHERE
m.dt_movimento = '2019-02-14'