Consulta UNION, GROUP BY e COUNT na mesma query filtrando por intervalo de datas

05/09/2015

Olá pessoal,

Não estou conseguindo avançar na criação de uma query que possa ter UNION, GROUP BY e COUNT baseado em um periodo de data na mesma consulta. Para eu atingir meu objetivo, necessito das seguintes ações na mesma consulta:

1º) filtrar, agrupar e contar todos os pedidos de clientes em um determinado período

2º) filtrar e agrupar os clientes que não enviaram pedidos no mesmo período

3º) identificar os clientes que enviaram pedido com um status = ATIVO

4º) Identificar os clientes que NÃO enviaram pedido com um status = INATIVO

5º) Na minha query abaixo ainda falta colocar na claúsula WHERE o filtro por intervalo de datas que passarei através de parâmetro.

Agradeço antecipadamente a ajuda dos colegas para atingir esse objetivo.



select "Cliente"."Nome" as Conveniado, "Municipios"."Nome" as Cidade,
       "Estado"."Nome" as Estado, 'ATIVO' as status
  from ((((dbo.Pedidos prt
  inner join dbo.Cliente Cliente
       on (Cliente.Id = prt.ClienteId))
  inner join dbo.Logradouro Logradouro
       on (Logradouro.Id = Cliente.Logradouro01Id))
  inner join dbo.Municipios Municipios
       on (Municipios.Id = Logradouro.MunicipioId))
  inner join dbo.Estado Estado
       on (Estado.Id = Municipios.EstadoId))
 where (prt.Inativo = 0)

UNION 

select Cliente.Nome as Conveniado, Municipios.Nome as Cidade,
       Estado.Nome as Estado, 'INATIVO' as status
  from ((((dbo.Pedidos prt
  inner join dbo.Cliente Cliente
       on (Cliente.Id = prt.ClienteId))
  inner join dbo.Logradouro Logradouro
       on (Logradouro.Id = Cliente.Logradouro01Id))
  inner join dbo.Municipios Municipios
       on (Municipios.Id = Logradouro.MunicipioId))
  inner join dbo.Estado Estado
       on (Estado.Id = Municipios.EstadoId))
 where ( )  // AQUI deverei implementar uma busca por intervalo de data, baseado no campo [prt.Cadastro], cujo os cliente AINDA NÃO fizeram pedidos no intervalo de datas

Melhor resposta

09/09/2015

Fala Hugo, tranquilo? fiz so o 1º item, acho que ficaria +- assim, da um olho ai e me fala o que achou
select prt.Periodo, Cliente.Nome as Conveniado, Municipios.Nome as Cidade, Estado.Nome as Estado, 'ATIVO' as status, count(Cliente.Nome) QTD
from dbo.Pedidos prt
  inner join dbo.Cliente Cliente on (Cliente.Id = prt.ClienteId)
  inner join dbo.Logradouro Logradouro on (Logradouro.Id = Cliente.Logradouro01Id)
  inner join dbo.Municipios Municipios on (Municipios.Id = Logradouro.MunicipioId)
  inner join dbo.Estado Estado on (Estado.Id = Municipios.EstadoId)
where prt.Inativo = 0
 and prt.Periodo between DataInicio and DataFim
group by prt.Periodo, Cliente.Nome as Conveniado, Municipios.Nome as Cidade, Estado.Nome as Estado; 


E aí Hector, tudo na paz?!

Muito obrigado pelo apoio, esse inicio de rotina irá me ajudar bastante.

Forte abraço
Responder Citar

Outras Respostas

08/09/2015

Hector Figueroa

Fala Hugo, tranquilo? fiz so o 1º item, acho que ficaria +- assim, da um olho ai e me fala o que achou
select prt.Periodo, Cliente.Nome as Conveniado, Municipios.Nome as Cidade, Estado.Nome as Estado, 'ATIVO' as status, count(Cliente.Nome) QTD
from dbo.Pedidos prt
  inner join dbo.Cliente Cliente on (Cliente.Id = prt.ClienteId)
  inner join dbo.Logradouro Logradouro on (Logradouro.Id = Cliente.Logradouro01Id)
  inner join dbo.Municipios Municipios on (Municipios.Id = Logradouro.MunicipioId)
  inner join dbo.Estado Estado on (Estado.Id = Municipios.EstadoId)
where prt.Inativo = 0
 and prt.Periodo between DataInicio and DataFim
group by prt.Periodo, Cliente.Nome as Conveniado, Municipios.Nome as Cidade, Estado.Nome as Estado; 
Responder Citar