Usuário com melhor resposta
falha ao agrupar dados de três tabelas.

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,
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
Todas as Respostas
-
-
-
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
-
-
-
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
-
Deleted
- Sugerido como Resposta Giovani Cr quinta-feira, 9 de janeiro de 2014 17:10
-
-
-
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. -
-
-
-
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
-
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.
-
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
-