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
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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...

Selecionar tudo

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; 
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

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

Brother,

Verifiquei que você não fez o agrupamento (Group by), pela coluna:

Selecionar tudo

B.QT_ESTOQUE      
A query te retornou um erro? Poderia postar pra gente?
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

Marques,

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

Selecionar tudo

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,
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

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,
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

Marques,

Veja se isso lhe ajuda!!

Selecionar tudo

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,
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

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

Selecionar tudo

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,
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

vetis apresentou o seguinte erro:

Selecionar tudo

 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
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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

Selecionar tudo

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;
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

Falow estamos sempre ai !
:idea:
att,
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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

Selecionar tudo

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
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

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,
marquesjr
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 77
Registrado em: Qua, 05 Dez 2007 10:51 am
Localização: Fortaleza - CE

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?
Avatar do usuário
vetis
Rank: Programador Pleno
Rank: Programador Pleno
Mensagens: 36
Registrado em: Sex, 25 Abr 2008 10:29 am
Localização: cariacica - es
Thiago Vetis
Creedence Clearwater Revival - :-o

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,
Responder
  • Informação
  • Quem está online

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