none
falha ao agrupar dados de três tabelas. RRS feed

  • Pergunta

  • Olá.
    Estou com problema ao criar um filtro em uma view com duas tabelas.
    A tabela CHAMADO possui os campos codchamado e codoperador.
    A tabela operador possui uma coluna chamada codoperador que se relaciona com a tabela CHAMADO.

    SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado INNER JOIN
                          dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     (dbo.Chamado.DATAINICIO BETWEEN '2013-12-01' AND '2013-12-31')
    GROUP BY dbo.Operador.NOMEOPERADOR, dbo.Chamado.DATAINICIO


    Grato,

    quinta-feira, 9 de janeiro de 2014 12:15

Respostas

  • SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado 
    INNER JOIN     dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     Convert(char(8),dbo.Chamado.DATAINICIO,112) BETWEEN '20130112' AND '20133112'
    GROUP BY dbo.Operador.NOMEOPERADOR

    Tenta assim.

    talvez dê certo.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Fabrício MD sexta-feira, 10 de janeiro de 2014 12:38
    quinta-feira, 9 de janeiro de 2014 19:05

Todas as Respostas

  • Fabricio, seu campo DATAINICIO é tipo datetime?

    O problema está na conversão, tente realizar um cast ou um convert.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quinta-feira, 9 de janeiro de 2014 12:36
  • Olá Frabrício,

    verifique o tipo dos dois campos de data, estou vendo na imagem que os dois são DATETIME e você está passando no filtro um campo DATE, são dois tipos distintos.

    DATE: '2014-01-09'

    DATETIME: '2014-01-09 10:39:45'

    Wennder

    quinta-feira, 9 de janeiro de 2014 12:40
  • Bom dia,

    Acho que o erro está ocorrendo por causa do formato da data.

    Acho também que para obter o resultado desejado será necessário alterar o Join e remover a coluna DataInicio do Group By:

    SELECT
        dbo.Operador.NOMEOPERADOR,
        COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM dbo.Chamado INNER 
    JOIN dbo.Operador 
        ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR 
    WHERE
        dbo.Chamado.DATAINICIO BETWEEN '20131201' AND '20131231'
    GROUP BY
        dbo.Operador.NOMEOPERADOR

    Espero que ajude.


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

    quinta-feira, 9 de janeiro de 2014 12:42
  • Eu tenho que converter para string, Kanaãm?
    quinta-feira, 9 de janeiro de 2014 12:43
  • pelo que entendi o Kanaãm pede pra vc mudar o filtro de date para datetime...é isso?
    quinta-feira, 9 de janeiro de 2014 12:46
  • Não, você só está passando o filtro em um tipo que não condiz com o campo DATAINICIO, tente assim:
    SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado INNER JOIN
                          dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     (dbo.Chamado.DATAINICIO BETWEEN '2013-12-01 00:00:00' AND '2013-12-31 00:00:00')
    GROUP BY dbo.Operador.NOMEOPERADOR, dbo.Chamado.DATAINICIO

    quinta-feira, 9 de janeiro de 2014 13:17
  • Deleted
    • Sugerido como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 17:10
    quinta-feira, 9 de janeiro de 2014 14:18
  • Oi José Diz.
    Obrigado pela ajuda.
    Esta dando erro no terceiro set.

    Vou tentar fazer como procedure para pegar o valor que o usuário digitar.
    Vou ver o que eu consigo, mas se tiver como dar uma força, eu agradeço.

    quinta-feira, 9 de janeiro de 2014 16:53
  • Deleted
    quinta-feira, 9 de janeiro de 2014 17:28
  • Eu percebi e mesmo assim deu erro conforme print.

    Criei uma SP e tem algo de errado porque o resultado foi apenas dois operadores com 1 chamado cada e tem 310 chamados no mês de Dezembro.

    CREATE PROCEDURE ChamadosOperadorMensal 
    	@DataInicial Datetime, 
    	@DataFinal Datetime
    AS
    BEGIN
    	(
    		SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado INNER JOIN
                          dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     (dbo.Chamado.DATAINICIO BETWEEN @DataInicial AND @DataFinal)
    GROUP BY dbo.Operador.NOMEOPERADOR, dbo.Chamado.DATAINICIO
    	
    	)
    	
    END
    GO

    Grato.
    quinta-feira, 9 de janeiro de 2014 17:50
  • Deleted
    quinta-feira, 9 de janeiro de 2014 18:09
  • Oi José.
    1) SQL Server 2005

    2) 03/12/2013 00:00:00

    3) O relatório é para emitir a quantidade total de chamadas para cada operador, no Mês selecionado.

    Obrigado.


    quinta-feira, 9 de janeiro de 2014 18:26
  • Deleted
    quinta-feira, 9 de janeiro de 2014 18:44
  • Fabricio,

    Na query que você postou da image, o trecho

    cast(DATAINICIO as date) 
    
    

    por

    Convert(char(10), dbo.Chamado.DATAINICIO, 112)

    Deve resolver.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    quinta-feira, 9 de janeiro de 2014 18:46
  • Kanaãm, Obrigado pela ajuda, mas não funcionou.

    USE [fireman3]
    GO
    
    IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[fireman].[ChamadosOperadorMensal]') AND type in (N'P', N'PC'))
    DROP PROCEDURE [fireman].[ChamadosOperadorMensal]
    GO
    
    USE [fireman3]
    GO
    
    
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    CREATE PROCEDURE [fireman].[ChamadosOperadorMensal] 
    	@DataInicial Datetime, 
    	@DataFinal Datetime
    AS
    BEGIN
    	(
    		SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado 
    INNER JOIN     dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     (convert(char(10),dbo.Chamado.DATAINICIO, 112) BETWEEN @DataInicial AND @DataFinal)
    GROUP BY dbo.Operador.NOMEOPERADOR
    	
    	)
    	
    END
    
    
    GO
    Retornou o mesmo resultado.
    Não seria porque a variavel esta como datetime e não como date?
    Obrigado.

    • Editado Fabrício MD quinta-feira, 9 de janeiro de 2014 19:01 Faltou o motivo.
    quinta-feira, 9 de janeiro de 2014 18:59
  • SELECT     dbo.Operador.NOMEOPERADOR, COUNT(dbo.Chamado.CODCHAMADO) AS QuantChamados
    FROM         dbo.Chamado 
    INNER JOIN     dbo.Operador ON dbo.Chamado.CODOPERADOR = dbo.Operador.CODOPERADOR AND dbo.Chamado.CODOPERADORRESP = dbo.Operador.CODOPERADOR
    WHERE     Convert(char(8),dbo.Chamado.DATAINICIO,112) BETWEEN '20130112' AND '20133112'
    GROUP BY dbo.Operador.NOMEOPERADOR

    Tenta assim.

    talvez dê certo.


    "A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski

    • Marcado como Resposta Fabrício MD sexta-feira, 10 de janeiro de 2014 12:38
    quinta-feira, 9 de janeiro de 2014 19:05
  • Obrigado a todos pela ajuda e pelo empenho.
    Funcionou com a dicas do José Diz e do Kanaãm.
    Infelizmente, eu só posso marcar um como resposta.
    Fiquem todos com Deus.
    sexta-feira, 10 de janeiro de 2014 12:38