Problema - GROUP BY com JOIN

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Seg, 23 Jun 2008 11:49 am

Pessoal o select abaixo não rodou, elaborei o select para agrupar (por produto) a soma das quantidades em estoque (antes do inventário, que estão separada por lote) com o estoque após o inventário.

Se alguém poder dá um força...

Código: Selecionar todos
SELECT
    A.CD_CONTAGEM,
    A.CD_PRODUTO,
    SUM(A.QT_ESTOQUE) AS QT_ANTERIOR,
    B.QT_ESTOQUE      AS QT_ATUAL
FROM
    DBAMV.COPIA_ESTOQUE A
LEFT OUTER JOIN
    DBAMV.ITCONTAGEM B
    ON
    (
        A.CD_CONTAGEM = B.CD_CONTAGEM
    )
    AND
    (
        A.CD_PRODUTO = B.CD_PRODUTO
    )
WHERE
    A.CD_CONTAGEM = 2189
GROUP BY
    A.CD_CONTAGEM,
    A.CD_PRODUTO
ORDER BY
    A.CD_PRODUTO ASC;
marquesjr
Localização: Fortaleza - CE

Mensagemem Seg, 23 Jun 2008 12:04 pm

Brother,

Verifiquei que você não fez o agrupamento (Group by), pela coluna:
Código: Selecionar todos
B.QT_ESTOQUE     


A query te retornou um erro? Poderia postar pra gente?
Trevisolli
Localização: Araraquara - SP

Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Mensagemem Seg, 23 Jun 2008 12:10 pm

Marques,

Não conseguir entender que informação você pretender conseguir atravez desse script.

SELECT
A.CD_CONTAGEM,
A.CD_PRODUTO,
-- Que informação você está localizando, como uma mesma coluna tem a contidade de estoque atual e anterior. --
SUM(A.QT_ESTOQUE) AS QT_ANTERIOR,
B.QT_ESTOQUE AS QT_ATUAL

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

FROM
DBAMV.COPIA_ESTOQUE A
LEFT OUTER JOIN
DBAMV.ITCONTAGEM B

-- Nessa parte não é necessário colocar os parentes neste caso --
ON
(
A.CD_CONTAGEM = B.CD_CONTAGEM
)
AND
(
A.CD_PRODUTO = B.CD_PRODUTO
)

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

WHERE
A.CD_CONTAGEM = 2189

-- Falta agrupar coluna B.QT_ESTOQUE para funcionar a soma que está na linha acima dela --
GROUP BY
A.CD_CONTAGEM,
A.CD_PRODUTO
--------------------------------------------------------------------------------------

ORDER BY
A.CD_PRODUTO ASC;



Passe mais informações para poder te ajudar !!

Att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Seg, 23 Jun 2008 1:26 pm

Bem, para ficar claro postei abaixo uma imagem contendo as duas tabela da consulta e a tabela resultante que quero:

Imagem

Vetis e Trevisolli, adicionei a coluna B.QT_ESTOQUE ao agrupamento (Group by), o código funcionou, mas ficaram alguma informações em branco:

Imagem[/url]
marquesjr
Localização: Fortaleza - CE

Mensagemem Seg, 23 Jun 2008 1:28 pm

Opa ajeitando o código:

Bem, para ficar claro postei abaixo uma imagem contendo as duas tabela da consulta e a tabela resultante que quero:

Imagem

Vetis e Trevisolli, adicionei a coluna B.QT_ESTOQUE ao agrupamento (Group by), o código funcionou, mas ficaram alguma informações em branco:

Imagem
marquesjr
Localização: Fortaleza - CE

Mensagemem Seg, 23 Jun 2008 1:31 pm

Opa ajeitando o código:

Bem, para ficar claro postei abaixo uma imagem contendo as duas tabela da consulta e a tabela resultante que quero:

Imagem

Vetis e Trevisolli, adicionei a coluna B.QT_ESTOQUE ao agrupamento (Group by), o código funcionou, mas ficaram alguma informações em branco:

Imagem
marquesjr
Localização: Fortaleza - CE

Mensagemem Seg, 23 Jun 2008 1:32 pm

Marques,
Não poderia te ajudar neste momento, pois o firewall da empresa bloqueia esse tipo de site. Mas assim que tiver um oportunidade estarei dando uma olhada e tentarei te ajudar nesse problema.
:D

att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Ter, 24 Jun 2008 8:58 am

Marques,

Veja se isso lhe ajuda!!

Código: Selecionar todos
SELECT
    A.CD_CONTAGEM,
    A.CD_PRODUTO,
    B.QT_ANTERIOR,
    B.QT_ESTOQUE AS QT_ATUAL
FROM (SELECT A.CD_CONTAGEM,A.CD_PRODUTO,SUM(A.QT_ESTOQUE) AS QT_ANTERIOR FROM DBAMV.COPIA_ESTOQUE GROUP BY A.CD_CONTAGEM,A.CD_PRODUTO) A
JOIN DBAMV.ITCONTAGEM B
    ON A.CD_CONTAGEM = B.CD_CONTAGEM
    AND A.CD_PRODUTO = B.CD_PRODUTO
WHERE
    A.CD_CONTAGEM = 2189
ORDER BY
    A.CD_PRODUTO ASC;


att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Ter, 24 Jun 2008 9:17 am

Desculpe, :oops:
não tirei o 'A' da frente no sub-sect.
Segue abaixo o correto.

Código: Selecionar todos
SELECT
    A.CD_CONTAGEM,
    A.CD_PRODUTO,
    B.QT_ANTERIOR,
    B.QT_ESTOQUE AS QT_ATUAL
FROM (SELECT CD_CONTAGEM,CD_PRODUTO,SUM(QT_ESTOQUE) AS   QT_ANTERIOR
         FROM DBAMV.COPIA_ESTOQUE
         GROUP BY CD_CONTAGEM,CD_PRODUTO) A
JOIN DBAMV.ITCONTAGEM B
    ON A.CD_CONTAGEM = B.CD_CONTAGEM
    AND A.CD_PRODUTO = B.CD_PRODUTO
WHERE
    A.CD_CONTAGEM = 2189
ORDER BY
    A.CD_PRODUTO ASC;


Veja se é isso mesmo que você deseja!

att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Ter, 24 Jun 2008 9:41 am

vetis apresentou o seguinte erro:

Código: Selecionar todos
09:41:44  [SELECT - 0 row(s), 0.000 secs]  [Error Code: 904, SQL State: 42000]  ORA-00904: "B"."QT_ANTERIOR": invalid identifier
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]
marquesjr
Localização: Fortaleza - CE

Mensagemem Ter, 24 Jun 2008 9:58 am

Substitui o B. pelo A. no QT_ANTERIOR, funcionou agradeço pela ajuda vetis, vou estudar mais as Sub-consulta.

Código: Selecionar todos
SELECT
    A.CD_CONTAGEM,
    A.CD_PRODUTO,
    B.QT_ESTOQUE AS QT_ATUAL,
    A.QT_ANTERIOR
FROM
    (
    SELECT
        CD_CONTAGEM,
        CD_PRODUTO,
        SUM(QT_ESTOQUE) AS QT_ANTERIOR
    FROM
        DBAMV.COPIA_ESTOQUE
    GROUP BY
        CD_CONTAGEM,
        CD_PRODUTO
    )
    A
JOIN
    DBAMV.ITCONTAGEM B
    ON
    A.CD_CONTAGEM    = B.CD_CONTAGEM
    AND A.CD_PRODUTO = B.CD_PRODUTO
WHERE
    A.CD_CONTAGEM = 2189
ORDER BY
    A.CD_PRODUTO ASC;
marquesjr
Localização: Fortaleza - CE

Mensagemem Ter, 24 Jun 2008 10:06 am

Falow estamos sempre ai !
:idea:
att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Ter, 24 Jun 2008 12:02 pm

vetis, os quantitativo não estão totalizando por porduto, como exemplo o produto 17409 está aparecendo 2 vezes (40, 40)

Código: Selecionar todos
CD_CONTAGEM   CD_PRODUTO   QT_ATUAL   QT_ANTERIOR
2189      17385      37      110
2189      17389      25      25
2189      17390      87      62
2189      17409      40      82
2189      17409      40      82
2189      17410      60      79
2189      17432      28      28
2189      17446      5      42
2189      17446      29      42
2189      17447      7      140
marquesjr
Localização: Fortaleza - CE

Mensagemem Ter, 24 Jun 2008 12:11 pm

Marques,

Deve haver dois registros para o mesmo produto, por isso quando se faz o join com a tabela B ele trás os dois.
Não é muito boinito mas utilizado o distinct para ver se resolver seu problema.


att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o

Mensagemem Ter, 24 Jun 2008 1:03 pm

vetis perfeito o DISTINCT (bem lembrado). Só mais um pergunta...
Como faço para aplicar a função SUM() na coluna QT_ESTOQUE da tabela ITCONTAGEM?
marquesjr
Localização: Fortaleza - CE

Mensagemem Ter, 24 Jun 2008 1:39 pm

Para utilizar o sum, terá que fazer um group by.
Agora vai cair na questão no que você deseja encontra, tenta utilizar o sum o select , ai se não funcionar criar um sub-select da mesma maneira do outro.

att,
vetis
Localização: cariacica - es

Thiago Vetis
Creedence Clearwater Revival - :-o


  • Veja também
    Respostas
    ExibiÇões
    Última mensagem


      Voltar para SQL

      Quem está online

      Usuários navegando neste fórum: Nenhum usuário registrado e 2 visitantes