none
Query não está funcionando como esperado RRS feed

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

    terça-feira, 8 de dezembro de 2015 11:07

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

    • Sugerido como Resposta Marcos SJ terça-feira, 8 de dezembro de 2015 18:41
    • Marcado como Resposta Marcos SJ quinta-feira, 10 de dezembro de 2015 18:01
    terça-feira, 8 de dezembro de 2015 17:03
  • 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
    sexta-feira, 29 de janeiro de 2016 19:15

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

    terça-feira, 8 de dezembro de 2015 12:17
  • 
    

    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
    terça-feira, 8 de dezembro de 2015 12:46
  • Você fez os testes conforme sugeri anteriormente?

    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 8 de dezembro de 2015 13:14
  • Sim. E o resultado muda um pouco:

    <tfoot></tfoot>
    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

    terça-feira, 8 de dezembro de 2015 13:37
  • 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]

    terça-feira, 8 de dezembro de 2015 13:51
  • Nunca utilizei o Grouping Sets, se você tiver algum exemplo poderia postar??? Enquanto isso vou dar uma pesquisada aqui para ver como é o seu funcionamento.

    Muito obrigado pela atenção!!!

    terça-feira, 8 de dezembro de 2015 14:02
  • 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

    terça-feira, 8 de dezembro de 2015 14:20
  • 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]

    terça-feira, 8 de dezembro de 2015 14:22
  • 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

    terça-feira, 8 de dezembro de 2015 16:22
  • 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

    terça-feira, 8 de dezembro de 2015 16:40
  • 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]


    terça-feira, 8 de dezembro de 2015 16:54
  • 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

    • Sugerido como Resposta Marcos SJ terça-feira, 8 de dezembro de 2015 18:41
    • Marcado como Resposta Marcos SJ quinta-feira, 10 de dezembro de 2015 18:01
    terça-feira, 8 de dezembro de 2015 17:03
  • 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.

    sexta-feira, 29 de janeiro de 2016 13:55
  • 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
    sexta-feira, 29 de janeiro de 2016 19:15