none
Ajuda com calculo das horas entre os vendedores. RRS feed

  • Pergunta

  • Bom tarde a todos, 

    Gostaria de uma ajudinha nessa query, preciso saber quanto tempo se passou entre

    Paul e Jonh,Jonh e Pierre,Pierre e Paulo, Paul e John , e depois agrupar.

    Gratidão!!

    CREATE  TABLE VENDEDOR  ( ID INT , IDSELL INT,TIMESELLER DATETIME2, SELLER_ORIGIM INT,SELLER_ATUAL INT,SELLERNAME VARCHAR(10));
    INSERT INTO VENDEDOR VALUES (1,10,'06/02/20 09:42:39,578000000',50,1000,'PAUL');
    INSERT INTO VENDEDOR VALUES (5,10,'17/02/20 09:42:39,578000000',1500,2000,'JONH');
    INSERT INTO VENDEDOR VALUES (8,10,'18/02/20 09:42:39,578000000',2000,50,'PIERRE');
    INSERT INTO VENDEDOR VALUES (11,10,'19/02/20 09:42:39,578000000',50,1000,'PAUL');
    INSERT INTO VENDEDOR VALUES (18,10,'20/02/20 09:42:39,578000000',1500,2000,'JONH');

     


    terça-feira, 2 de junho de 2020 18:04

Todas as Respostas

  • Boa tarde,

    Qual versão do SQL Server você está utilizando?

    Você quer utilizar qual unidade para apresentar o tempo que passou?


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 2 de junho de 2020 18:21
  • Henrique,

    Este tempo ao qual você se refere seria o cálculo da diferença em dias entre os possíveis vendedores?

    Veja se inicialmente este exemplo te ajuda:

    -- SQL Server 2008 R2 ou inferior --
    Select (V.SellerName + ' --> ' + IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TIMESELLER, V2.TIMESELLER),0) As 'Tempo em Dias' 
    From VENDEDOR V Outer Apply (Select Top 1 SELLERNAME, TIMESELLER 
                                                             From VENDEDOR V1 
    														 Where V.ID < V1.ID 
    														 Order By Id) As V2
    Go
    
    -- Versão 2012 ou Superior --
    Select Concat(V.SellerName, ' --> ',IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TIMESELLER, V2.TIMESELLER),0) As 'Tempo em Dias' 
    From VENDEDOR V Outer Apply (Select Top 1 SELLERNAME, TIMESELLER 
                                                             From VENDEDOR V1 
    														 Where V.ID < V1.ID 
    														 Order By Id) As V2
    Go

    O mesmo foi elaborada com base na estrutura que você postou anteriormente.

    Quando se refere ao agrupamento, você deseja agrupar levando em consideração o Nome dos Vendedores somando o tempo?

    Se for, acho que esta outra parte do exemplo vai te ajudar:

    ;With CTEDiferencaEntreFornecedores2008 (Sellername, Tempo)
    As
    (
    Select (V.SellerName + ' --> ' + IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TIMESELLER, V2.TIMESELLER),0) As 'Tempo' 
    From VENDEDOR V Outer Apply (Select Top 1 SELLERNAME, TIMESELLER 
                                                             From VENDEDOR V1 
    														 Where V.ID < V1.ID 
    														 Order By Id) As V2
    )
    Select SellerName, Sum(Tempo) As SomaDoTempo 
    From CTEDiferencaEntreFornecedores2008
    Group By Sellername
    Order By Sellername
    Go
    
    -- Versão 2012 ou Superior --
    ;With CTEDiferencaFornecedores2012 (SellerName, Tempo)
    As
    (Select Concat(V.SellerName, ' --> ',IsNull(V2.SellerName,'')) As SellerName,
               IsNull(DateDiff(D, V.TIMESELLER, V2.TIMESELLER),0) As 'Tempo em Dias' 
    From VENDEDOR V Outer Apply (Select Top 1 SELLERNAME, TIMESELLER 
                                                             From VENDEDOR V1 
    														 Where V.ID < V1.ID 
    														 Order By Id) As V2
    )
    Select SellerName, Sum(Tempo) As SomaDoTempo 
    From CTEDiferencaFornecedores2012
    Group By Sellername
    Order By Sellername
    Go


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 2 de junho de 2020 23:10
  • select id,lag(timeseller) over(order by id),timeseller,datediff(dd,lag(timeseller) over(order by id),timeseller) from vendedor;
    • Sugerido como Resposta Avatar SQL quarta-feira, 3 de junho de 2020 17:17
    quarta-feira, 3 de junho de 2020 16:46
  • Moderador,

    Pegando o gancho da sua sugestão, elaborei um outro exemplo, fazendo justamente uso das funções DateDiff() mas ao invês de usar Lag() utilizei a Lead():

    -- Identificando o próximo vendedor utilizando a Função Lead() e calculando a diferença através da Função DateDiff() --
    Select V.SellerName, V2.SellerName, 
               V.TimeSeller,
    		   V2.TimeSeller As 'TimeSellerProximo',
    		   IsNull(DateDiff(dd, V.TimeSeller, Lead(V.TimeSeller) Over(Order By V.Codigo)),0) As 'Diferença em Dias'
    From Vendedores V Outer Apply (Select Top 1 Codigo, SellerName, TimeSeller From Vendedores V1
                                                              Where V.Codigo < V1.Codigo
    														  Order By V.Codigo) As V2
    Go
    
    -- Agrupando --
    ;With CTEDiferencaFornecedores (SellerNameAtual, SellerNameProximo, TimeSellerAnterior, TimeSellerProximo, DiferencaEmDias)
    As
    (
    Select V.SellerName, V2.SellerName, 
               V.TimeSeller,
    		   V2.TimeSeller,
    		   IsNull(DateDiff(dd, V.TimeSeller, Lead(V.TimeSeller) Over(Order By V.Codigo)),0)
    From Vendedores V Outer Apply (Select Top 1 Codigo, SellerName, TimeSeller From Vendedores V1
                                                              Where V.Codigo < V1.Codigo
    														  Order By V.Codigo) As V2
    )
    Select Concat(SellerNameAtual,' - ', SellerNameProximo) As SellerName,
    			Sum(DiferencaEmDias) As Somatoria
    From CTEDiferencaFornecedores
    Group By SellerNameAtual, SellerNameProximo 
    Order By Somatoria
    Go

    Acho que pode complementar a sua sugestão.

    Vale ressaltar que o código esta implementado para ser executado a partir da versão 2012.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quarta-feira, 3 de junho de 2020 21:09
  • pode copiar mas se seu palpite estava errado agora esta mais errado ainda. lead nao e lag!
    quinta-feira, 4 de junho de 2020 13:01
  • pode copiar mas se seu palpite estava errado agora esta mais errado ainda. lead nao e lag!

    Nobre colega, eu não estou copiando, muito menos afirmei que o meu palpite estava certo, talvez você não tenha percebido.

    Mas neste fórum eu como um dos Moderadores Oficiais sempre estou aqui propondo possíveis soluções, bem como, aprendendo com todos.

    Espero que você também possa fazer o mesmo.

    Aproveito para lhe dar as boas vindas.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]


    quinta-feira, 4 de junho de 2020 21:35