Usuário com melhor resposta
Query não está funcionando como esperado

Pergunta
-
Bom dia a todos
Tenho duas tabelas, são elas: Pacotes2 Cont_seq Numero do corte Número do pacote Quantidade Tamanho Cor Código setor Sequencial Barras Int~lan 1 1012 1 31 60 PRETO 0033 001031 101200100031 1 2 1012 2 25 60 PRETO 0033 032056 101200200025 2 3 1012 2 6 58 PRETO 0033 001006 101200200006 3 4 1012 3 31 58 PRETO 0033 007037 101200300031 4 5 1012 4 19 58 PRETO 0033 038056 101200400019 5 6 1012 4 12 56 PRETO 0033 001012 101200400012 6 7 1012 5 31 56 PRETO 0033 013043 101200500031 7 8 1012 6 31 56 PRETO 0033 044074 101200600031 8 9 1012 7 30 56 PRETO 0033 075104 101200700030 9 10 1012 8 6 56 PRETO 0033 105110 101200800006 10 11 1012 8 24 54 PRETO 0033 001024 101200800024 11 12 1012 9 30 54 PRETO 0033 025054 101200900030 12 13 1012 10 30 54 PRETO 0033 055084 101201000030 13 14 1012 11 26 54 PRETO 0033 085110 101201100026 14 15 1012 11 4 52 PRETO 0033 001004 101201100004 15 16 1012 12 30 52 PRETO 0033 005034 101201200030 16 Produção Contador Data Codigo Operação Numero do corte Pacote Quantidade Hora 1421014 04/12/2015 1932 0111 1012 8 1 08:12:16 1421011 04/12/2015 1932 0111 1012 10 10 08:11:17 1421013 04/12/2015 1932 0111 1012 10 1 08:12:02 1421010 04/12/2015 1932 0111 1012 11 10 08:11:11 1421012 04/12/2015 1932 0111 1012 11 1 08:11:47 Montei a seguinte query: SELECT [produção].[numero do corte], [produção].[pacote], [produção].[operação], SUM([produção].[quantidade]) as Produzido, SUM([pacotes2].[quantidade]) as Pedido FROM [produção], [pacotes2] WHERE [produção].[numero do corte] = [pacotes2].[numero do corte] AND [produção].[pacote] = [pacotes2].[número do pacote] group by [produção].[numero do corte], [produção].[pacote], [produção].[operação], [produção].[quantidade]; E é retornado o seguinte para mim: numero do corte pacote operação Produzido Pedido 1012 8 0111 2 30 1012 10 0111 1 30 1012 10 0111 10 30 1012 11 0111 2 30 1012 11 0111 20 30 A informação não está legal, o esperado por mim seria assim: numero do corte pacote operação Produzido Pedido 1012 8 0111 1 30 1012 10 0111 11 30 1012 11 0111 11 30 Alguém poderia me ajudar a montar essa query corretamente???? Grato ...
Respostas
-
Marcos, não sei se vai funcionar no Access mas experimente dessa forma:
SELECT prd.[numero do corte], prd.[pacote], prd.[operação], prd.Produzido, pac.Pedido FROM ( SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção] group by [numero do corte], [pacote], [operação] ) as prd INNER JOIN ( SELECT [numero do corte], [número do pacote], SUM([quantidade]) as Pedido FROM [pacotes2] group by [numero do corte], [número do pacote] ) as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote]
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Não tenho nenhuma experiência com o Access mas parece que uma alternativa é utilizar o Union All.
Experimente fazer um teste dessa forma:
SELECT prd.[numero do corte], prd.[pacote], prd.[operação], prd.Produzido, pac.Pedido FROM ( SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção] group by [numero do corte], [pacote], [operação] ) as prd LEFT JOIN ( SELECT [numero do corte], [número do pacote], SUM([quantidade]) as Pedido FROM [pacotes2] group by [numero do corte], [número do pacote] ) as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote] UNION ALL SELECT pac.[numero do corte], pac.[número do pacote], null, null, SUM([pac.quantidade]) as Pedido FROM [pacotes2] as pac WHERE NOT EXISTS (SELECT 1 FROM [produção] as prf WHERE prd.[numero do corte] = pac.[numero do corte] AND prd.[pacote] = pac.[número do pacote]) group by pac.[numero do corte], pac.[número do pacote]
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ segunda-feira, 1 de fevereiro de 2016 16:00
Todas as Respostas
-
Bom dia,
Não consegui entender muito bem a sua amostra de dados, mas experimente fazer uns testes removendo a coluna [produção].[quantidade] do Group By para ver se é obtido o resultado desejado.
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Realmente, saiu meio desalinhado. Vou tentar recolocar aqui:
Tabaela Pacotes2 Cont_seq Numero do corte Número do pacote Quantidade Tamanho 1 1012 1 31 60 2 1012 2 25 60 3 1012 2 6 58 4 1012 3 31 58 5 1012 4 19 58 6 1012 4 12 56 7 1012 5 31 56 8 1012 6 31 56 9 1012 7 30 56 10 1012 8 6 56 11 1012 8 24 54 12 1012 9 30 54 13 1012 10 30 54 14 1012 11 26 54 15 1012 11 4 52 16 1012 12 30 52 Tabela Produção Contador Data Codigo Operação Numero do corte Pacote Quantidade Hora 1421014 04/12/2015 1932 0111 1012 8 1 08:12:16 1421011 04/12/2015 1932 0111 1012 10 10 08:11:17 1421013 04/12/2015 1932 0111 1012 10 1 08:12:02 1421010 04/12/2015 1932 0111 1012 11 10 08:11:11 1421012 04/12/2015 1932 0111 1012 11 1 08:11:47
A minha query retorna o resultado abaixo:
numero do corte pacote operação Produzido Pedido 1012 8 0111 2 30 1012 10 0111 1 30 1012 10 0111 10 30 1012 11 0111 2 30 1012 11 0111 20 30
Porém o resultado esperado teria que ser esse: (repare nos campos PACOTE, PRODUZIDO e PEDIDO. Não estão batendo as quantidades)
Numero do corte pacote operação Produzido Pedido 1012 8 0111 1 30 1012 10 0111 11 30 1012 11 0111 11 30
Grato...
- Editado Marcos SJ terça-feira, 8 de dezembro de 2015 13:08 Edição
-
-
Sim. E o resultado muda um pouco:
Consulta1 numero do corte pacote operação Produzido Pedido 1012 8 0111 2 30 1012 10 0111 11 60 1012 11 0111 22 60 o correto seria:
numero do corte pacote operação produzido pedido
1012 8 0111 1 30
1012 10 0111 11 30
1012 11 0111 11 30
-
Marcos,
Talvez não seja o caso de utilizando o Grouping Sets? Para realizar o tipo de agrupamento que você esta querendo fazer e sumarizar da forma desejada.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
-
Experimente fazer alguns testes com a query abaixo:
with CTE_Producao as ( SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção] group by [numero do corte], [pacote], [operação] ), CTE_Pacotes as ( SELECT [numero do corte], [número do pacote], SUM([quantidade]) as Pedido FROM [pacotes2] group by [numero do corte], [número do pacote] ) SELECT prd.[numero do corte], prd.[pacote], prd.[operação], prd.Produzido, pac.Pedido FROM CTE_Producao as prd INNER JOIN CTE_Pacotes as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote]
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Marcos,
Veja estes exemplos:
create table #T (Customer varchar(100),Year int,Sales money); insert into #T (Customer, Year, Sales)values ('Jack', 2010, 10) ,('Jack', 2010, 15) ,('Bob', 2009, 5) ,('Dick',2011, 20); -- Sem Grouping Sets -- SELECT NULL as customer, year, SUM(sales)FROM #T GROUP BY year UNION ALL SELECT customer, NULL as year, SUM(sales)FROM #T GROUP BY customer; -- Com Grouping Sets -- SELECT customer, year, SUM(sales)FROM #T GROUP BY GROUPING SETS ((customer), (year));
-- Desabilitando a contagem de linhas -- Set NoCount On; -- Verificando se a Tabela OrdemProducao já esta cadastrada -- If OBJECT_ID('dbo.OrdemProducao','U') Is Not Null Drop Table dbo.OrdemProducao Go -- Criando a Tabela OrdemProducao -- Create Table OrdemProducao (NumProducao Int Not Null, Data Date Not Null, CodFuncionario Int Not Null, Setor Varchar(2) Not Null, Quantidade Int Not Null ) Go -- Adicionando Chave Primária na Tabela OrdemProducao -- Alter Table OrdemProducao Add Constraint [PK_OrdemProducao_NumProducao] Primary Key Clustered (NumProducao) Go -- Inserindo dados na Tabela OrdemProducao -- Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade) Values (1000, '20091001',1,'A',20), (1001, '20091002',2,'B',30), (1002, '20091003',3,'D',15), (1003, '20091005',2,'D',12), (2000, '20100210',4,'C',40), (2001, '20100211',4,'C',35), (2002, '20100312',2,'A',22), (2004, '20100414',2,'B',12), (3005, '20110601',1,'C',50), (3006, '20110602',3,'B',60) Insert Into OrdemProducao (NumProducao, Data, CodFuncionario, Setor, Quantidade) Values (10000, '20091001',1,'A',20), (10001, '20091002',2,'B',30), (10002, '20091003',3,'D',15), (10003, '20091005',2,'D',12), (20000, '20100210',4,'C',40), (20001, '20100211',4,'C',35), (20002, '20100312',2,'A',22), (20004, '20100414',2,'B',12), (30005, '20110601',1,'C',50), (30006, '20110602',3,'B',60) -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao) na Tabela OrdemProducao -- Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma from dbo.OrdemProducao Group By GROUPING Sets ( (Setor, CodFuncionario, YEAR(DATA)) ) Go -- Aplicando o Grouping Sets (Setor, CodFuncionario e AnoProducao + AnoProd) na Tabela OrdemProducao -- Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma from dbo.OrdemProducao Group By GROUPING Sets ( (Setor, CodFuncionario, YEAR(DATA)), (YEAR(Data)) ) Go -- Simultando o Grouping Sets utilizando Union All -- Select Setor, CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma from dbo.OrdemProducao Group By Setor, CodFuncionario, YEAR(Data) Union All Select Null As Setor, Null As CodFuncionario, YEAR(Data) As 'Ano de Produção', SUM(Quantidade) As Soma from dbo.OrdemProducao Group By YEAR(Data)
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
-
gapimex obrigado pela dica.
Adaptei a query pois no momento estou testando a mesma no access, ela ficou assim:
SELECT A.[numero do corte], A.[pacote], A.[operação], SUM(A.[quantidade]) as Produzido, B.[numero do corte], B.[número do pacote], SUM(B.[quantidade]) as Pedido, PRD.[numero do corte], PRD.[pacote], PRD.[operação], PRD.Produzido, PAC.Pedido FROM [produção] as A, [pacotes2] as B, [produção] as PRD INNER JOIN B as PAC ON PAC.[numero do corte] = PRD.[numero do corte] AND PAC.[número do pacote] = PRD.[pacote] GROUP BY A.[numero do corte], A.[pacote], A.[operação], B.[numero do corte], B.[número do pacote], PRD.[numero do corte], PRD.[pacote], PRD.[operação];
Porém está me dizendo que não foi possível encontrar a tabela de entrada ou consulta (B).
Poderia me ajudar a descobrir o que estou fazendo de errado?
Grato
-
Junior obrigado pela dica.
Adaptei a query pois no momento estou testando a mesma no access, ela ficou assim:
SELECT A.[numero do corte], A.[pacote], A.[operação], SUM(A.[quantidade]) as Produzido, B.[numero do corte], B.[número do pacote], SUM(B.[quantidade]) as Pedido, PRD.[numero do corte], PRD.[pacote], PRD.[operação], PRD.Produzido, PAC.Pedido FROM [produção] as A, [pacotes2] as B, [produção] as PRD INNER JOIN B as PAC ON PAC.[numero do corte] = PRD.[numero do corte] AND PAC.[número do pacote] = PRD.[pacote] GROUP BY A.[numero do corte], A.[pacote], A.[operação], B.[numero do corte], B.[número do pacote], PRD.[numero do corte], PRD.[pacote], PRD.[operação];
Porém está me dizendo que não foi possível encontrar a tabela de entrada ou consulta (B).
Poderia me ajudar a descobrir o que estou fazendo de errado?
Grato
-
Marcos,
Vamos lá, algumas observações:
1 - Evitar nomear suas colunas com espaço e caracteres especiais;
2 - Evitar nomear suas colunas com acentuação;
3 - Não é possível definir um apelido para uma tabela e depois utilizar este mesmo apelido como se fosse outra tabela e atribuir outro apelido novamente.
Em relação a mensagem dizendo encontra a entrada B, no caso a tabela B acredito que isso esteja acontencendo pois você esta fazendo a mesma query duas formas diferentes de junção de tabelas.
Veja se desta forma funciona:
SELECT A.[numero do corte], A.[pacote], A.[operação], SUM(A.[quantidade]) as Produzido, B.[numero do corte], B.[número do pacote], SUM(B.[quantidade]) as Pedido, PRD.[numero do corte], PRD.[pacote], PRD.[operação], PRD.Produzido, PAC.Pedido FROM [produção] as A, [pacotes2] as B, [produção] as PRD INNER JOIN [Pacotes2] as PAC ON PAC.[numero do corte] = PRD.[numero do corte] AND PAC.[número do pacote] = PRD.[pacote] GROUP BY A.[numero do corte], A.[pacote], A.[operação], B.[numero do corte], B.[número do pacote], PRD.[numero do corte], PRD.[pacote], PRD.[operação];
Você ao mesmo tempo que estava definindo a tabela pacotes2 como B, você esta utilizando B como PAC, provavelmente nessa parte o SQL Server estava apresentando o erro.
Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]
- Editado Junior Galvão - MVPMVP terça-feira, 8 de dezembro de 2015 16:56
-
Marcos, não sei se vai funcionar no Access mas experimente dessa forma:
SELECT prd.[numero do corte], prd.[pacote], prd.[operação], prd.Produzido, pac.Pedido FROM ( SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção] group by [numero do corte], [pacote], [operação] ) as prd INNER JOIN ( SELECT [numero do corte], [número do pacote], SUM([quantidade]) as Pedido FROM [pacotes2] group by [numero do corte], [número do pacote] ) as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote]
Espero que ajude.
Assinatura: http://www.imoveisemexposicao.com.br
-
Gapimex bom dia.
Desculpe a demora, estava viajando e acabei parando com esse projeto. Mas agora estou de volta.
A sua query funcionou perfeitamente, ficou assim:
SELECT prd.[numero do corte] as corte_p, prd.[pacote] as pacote_p, prd.[operação] as operacao_p, prd.Produzido as prod_p, pac.Pedido as ped_p, pac.[Codigo setor] as setor_p
FROM(SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção]
group by [numero do corte], [pacote], [operação]) as prd
INNER JOIN(SELECT[numero do corte], [número do pacote], SUM([quantidade]) as Pedido, [Codigo setor] FROM [pacotes2]
group by [numero do corte], [número do pacote], [Codigo setor]) as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote];Porém surgiu uma outra dúvida: Como faço para mostrar todos os registros de todas as tabela? Já tentei utilizar o FULL OUTER JOIN porém o Access não suporta.
Você teria alguma outra idéia de como fazer isso?
Grato.
- Sugerido como Resposta Junior Galvão - MVPMVP sexta-feira, 29 de janeiro de 2016 14:09
-
Não tenho nenhuma experiência com o Access mas parece que uma alternativa é utilizar o Union All.
Experimente fazer um teste dessa forma:
SELECT prd.[numero do corte], prd.[pacote], prd.[operação], prd.Produzido, pac.Pedido FROM ( SELECT [numero do corte], [pacote], [operação], SUM([quantidade]) as Produzido FROM [produção] group by [numero do corte], [pacote], [operação] ) as prd LEFT JOIN ( SELECT [numero do corte], [número do pacote], SUM([quantidade]) as Pedido FROM [pacotes2] group by [numero do corte], [número do pacote] ) as pac ON pac.[numero do corte] = prd.[numero do corte] AND pac.[número do pacote] = prd.[pacote] UNION ALL SELECT pac.[numero do corte], pac.[número do pacote], null, null, SUM([pac.quantidade]) as Pedido FROM [pacotes2] as pac WHERE NOT EXISTS (SELECT 1 FROM [produção] as prf WHERE prd.[numero do corte] = pac.[numero do corte] AND prd.[pacote] = pac.[número do pacote]) group by pac.[numero do corte], pac.[número do pacote]
Espero que ajude
Assinatura: http://www.imoveisemexposicao.com.br
- Marcado como Resposta Marcos SJ segunda-feira, 1 de fevereiro de 2016 16:00