Usuário com melhor resposta
Fazer consulta utilizando MAX

Pergunta
-
Boas..
Tenho a seguinte consulta em que quero contar todos os clientes e os seus atendimentos para determinada situação profissional (empregado, desempregado, etc), mas como cada um pode ter mais de que uma situação profissional para o intervalo de tempo, quero que ele vá buscar a que tiver maior diferença de tempo.. O problema é que o MAX não me está a funcionar, e devolve sempre o primeiro registo..(está a negrito)
Obrigado desde já...Segue a consulta
SELECT (SELECT descricaosituacaoprofissional FROM situacaoprofissional WHERE id=temppro.idtiposituacao) , COUNT(DISTINCT (CASE clientes.sexo WHEN "M" THEN clientes.id END)) , COUNT(DISTINCT (CASE clientes.sexo WHEN "F" THEN clientes.id END)) ,COUNT( (CASE clientes.sexo WHEN "M" THEN temp.idcliente END)) , COUNT( (CASE clientes.sexo WHEN "F" THEN temp.idcliente END)) FROM clientes INNER JOIN (SELECT DISTINCT idcliente, idservicoprestado FROM servicosprestados_elementos GROUP BY idservicoprestado HAVING count(idservicoprestado)=1) AS temp ON temp.idcliente=clientes.id INNER JOIN servicosprestados ON temp.idservicoprestado= servicosprestados.id INNER JOIN (SELECT idcliente, idtiposituacao, datainicio, datafim, max(DATEDIFF(IFNULL(datafim,CURDATE()), datainicio)) FROM situacaoprofissional GROUP BY idcliente HAVING MAX(DATEDIFF(IFNULL(datafim,CURDATE()), datainicio))) AS temppro ON temppro.idcliente=clientes.id WHERE processoanulado=0 AND clientes_servicosprestadosfamilia.anulado=0 AND ((DATE(servicosprestados.datainicio) >= '2012-01-01' OR '2012-01-01' <= DATE(servicosprestados.datafim)) AND DATE(servicosprestados.datainicio) <= '2012-01-27') AND servicosprestados.idservico = '1' AND ((DATE(temppro.datainicio) >= '2012-01-01' OR '2012-01-01' <= DATE(temppro.datafim)) AND (DATE(temppro.datainicio) <= '2012-01-27') OR (temppro.datafim IS NULL AND CURDATE() >= temppro.datainicio)) GROUP BY temppro.idtiposituacao
- Editado Vitor Martins segunda-feira, 30 de janeiro de 2012 13:36
Respostas
-
Vitor seguindo o seu exemplo fiz o script abaixo usando CTE e Row_number (para sql 2005 ou superior)
declare @clientes table (id int, nomecliente varchar(20)) insert into @clientes values (1,'antonio'),(2,'manuel') declare @situacaoprofissional table (id int, idcliente int, idtiposituacao varchar(20), datainicio datetime, datafim datetime) insert into @situacaoprofissional values(1,1,'Empregado','20120101','20120103'),(2,1,'Desempregado','20120104','20120116') declare @servicosprestados table (id int, data datetime, servico int) insert into @servicosprestados values (1, '20111212',1),(2,'20121213',2) declare @servicosprestados_elementos table (id int, idservicoprestado int, idcliente int) insert into @servicosprestados_elementos values (1, 1, 1),(1, 2, 2) ;with cte_dados as ( SELECT idtiposituacao as'Situacaoprofissional',a.id as 'Clientes', row_number() over (partition by a.id order by a.id, datediff(dd,datainicio,datafim) desc) numerador, count( d.id) as 'Atendimentos' FROM @clientes a inner join @situacaoprofissional b on a.id = b.idcliente inner join @servicosprestados_elementos c on a.id = c.idcliente inner join @servicosprestados d on c.idservicoprestado = d.id group by idtiposituacao, a.id, datainicio,datafim ) select Situacaoprofissional, Clientes, Atendimentos from cte_dados where numerador = 1
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Eder Costa terça-feira, 7 de fevereiro de 2012 14:24
- Marcado como Resposta Heloisa Pires quarta-feira, 11 de abril de 2012 18:10
Todas as Respostas
-
Vitor
Apenas para melhorar o entendimento, poderia ilustar sua duvida com um exemplo de como estão os dados em sua tabela e como vc deseja o resultado?
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba -
Aqui vai versão abreviada
clientes
id nomecliente 1 antonio 2 manuel situacaoprofissional
id idcliente idtiposituacao datainicio datafim 1 1 Empregado 01-01-12 03-01-12 2 1 Desempregado 04-01-12 16-01-12 servicosprestados
id data servico 1 12-12-11 1 2 13-12-11 2 servicosprestados_elementos
id idservicoprestado idcliente 1 1 1 1 2 2 Resultado Pretendido
Situacaoprofissional Clientes Atendimentos Desempregado 1 1 O que me falta é que ele consiga diferenciar nos dois registos da situacaoprofissional e me mostra o que tem maior diferença de data. Nesta caso o desempregado
-
Vitor seguindo o seu exemplo fiz o script abaixo usando CTE e Row_number (para sql 2005 ou superior)
declare @clientes table (id int, nomecliente varchar(20)) insert into @clientes values (1,'antonio'),(2,'manuel') declare @situacaoprofissional table (id int, idcliente int, idtiposituacao varchar(20), datainicio datetime, datafim datetime) insert into @situacaoprofissional values(1,1,'Empregado','20120101','20120103'),(2,1,'Desempregado','20120104','20120116') declare @servicosprestados table (id int, data datetime, servico int) insert into @servicosprestados values (1, '20111212',1),(2,'20121213',2) declare @servicosprestados_elementos table (id int, idservicoprestado int, idcliente int) insert into @servicosprestados_elementos values (1, 1, 1),(1, 2, 2) ;with cte_dados as ( SELECT idtiposituacao as'Situacaoprofissional',a.id as 'Clientes', row_number() over (partition by a.id order by a.id, datediff(dd,datainicio,datafim) desc) numerador, count( d.id) as 'Atendimentos' FROM @clientes a inner join @situacaoprofissional b on a.id = b.idcliente inner join @servicosprestados_elementos c on a.id = c.idcliente inner join @servicosprestados d on c.idservicoprestado = d.id group by idtiposituacao, a.id, datainicio,datafim ) select Situacaoprofissional, Clientes, Atendimentos from cte_dados where numerador = 1
Att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS.
Se útil, classifique!!!
Me siga no twitter: @marcelodba- Sugerido como Resposta Eder Costa terça-feira, 7 de fevereiro de 2012 14:24
- Marcado como Resposta Heloisa Pires quarta-feira, 11 de abril de 2012 18:10
-
-
-