none
Fazer consulta utilizando MAX

    Question

  • 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
    


     


    Monday, January 30, 2012 1:35 PM

Answers

  • 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

    Monday, January 30, 2012 4:40 PM

All replies

  • 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

    Monday, January 30, 2012 1:43 PM
  • 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

    Monday, January 30, 2012 1:49 PM
  • 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

    Monday, January 30, 2012 4:40 PM
  • Obrigado pela resposta, mas precisava de uma solução em SQL só..

    Tuesday, January 31, 2012 9:22 AM
  • Vitor

    esta solução é SQL!
    Qua a versão de seu SQL? execute o teste que postei se seu SQL for 2005 funcionará.


    Att.
    Marcelo Fernandes

    MCP, MCDBA, MCSA, MCTS.
    Se útil, classifique!!!
    Me siga no twitter: @marcelodba

    Tuesday, January 31, 2012 1:19 PM
  • O que eu queria dizer é não precisasse de utilizar nenhuma função do sql server
    Wednesday, February 01, 2012 9:03 AM