none
Calcular diferença entre datas em uma coluna RRS feed

  • Pergunta

  • Boa tarde a todos,

    Preciso gerar um relatorio onde informo o tempo total de anos em que um cliente ficou ativo. Guardamos os dados em colunas com o status do cliente.

    Exemplo:

    declare @cadastro table
    (
       ROW int IDENTITY(1,1) NOT NULL, 
       codigo int null,
       [data] date,
       [status] varchar(10)
    )
    
    insert into @cadastro (codigo, data, status) values 
    (10, '2010-01-01', 'admitido'), 
    (10, '2014-01-01', 'suspenso'), 
    (11, '2011-01-01', 'admitido'), 
    (11, '2012-01-01', 'suspenso'), 
    (11, '2013-01-01', 'readmitido'), 
    (11, '2014-01-01', 'suspenso'), 
    (11, '2015-01-01', 'readmitido'), 
    (11, '2016-01-01', 'suspenso'), 
    (12, '2013-01-01', 'admitido'), 
    (12, '2016-01-01', 'suspenso')
    (12, '2017-01-01', 'readmitido'), 
    (12, '2018-01-01', 'suspenso')
    
    
    select *
    from @cadastro 
    

    Preciso que o resultado seja da seguinte forma:

    Ou seja, calcular a (data de admissão - data suspensao) e quando o cliente for readmitido várias vezes calcular também todas as readmissões e suspensões que tiveram.

    Obrigado pela ajuda!

    quarta-feira, 12 de dezembro de 2018 15:33

Respostas

Todas as Respostas

  • Boa tarde.

    Qual versão do SQL?

    Isso pode ser um começo.

    declare @cadastro table
    (
       ROW int IDENTITY(1,1) NOT NULL, 
       codigo int null,
       [data] date,
       [status] varchar(10)
    )
    
    insert into @cadastro (codigo, data, status) values 
    (10, '2010-01-01', 'admitido'), 
    (10, '2014-01-01', 'suspenso'), 
    (11, '2011-01-01', 'admitido'), 
    (11, '2012-01-01', 'suspenso'), 
    (11, '2013-01-01', 'readmitido'), 
    (11, '2014-01-01', 'suspenso'), 
    (11, '2015-01-01', 'readmitido'), 
    (11, '2016-01-01', 'suspenso'), 
    (12, '2013-01-01', 'admitido'), 
    (12, '2016-01-01', 'suspenso'),
    (12, '2017-01-01', 'readmitido'), 
    (12, '2018-01-01', 'suspenso')
    
    ;with cte as (
    select *, row_number() over ( partition by codigo order by data asc ) linha, case when status in ('suspenso','demitido') then datediff(year, lag(data) over ( partition by codigo order by data asc ), data ) end anos
    from @cadastro )
    select codigo, sum(anos) from cte group by codigo
    
    
    


    Vinicius Fonseca - MCP | MCTS | MCDBA | MCITP | MCTS | MCT | ITIL Foundation - DGA SISTEMAS - Se minha resposta for útil, classifique-a. :)


    quarta-feira, 12 de dezembro de 2018 15:53
  • SQL Server 2014
    quarta-feira, 12 de dezembro de 2018 17:44
  • Deleted
    sábado, 22 de dezembro de 2018 14:29