已答复 Ultimo registro errado

  • segunda-feira, 23 de julho de 2012 17:54
     
     

    Pessoal,

    To precisando de uma dica, se alguem puder me ajudar é claro:

    No comando abaixo eu precisei colocar o comando MAX no nome do funcionario, pois estava duplicando a linha.

    Porem com o comando MAX ele traz o nome do usuario por ordem máxima alfabetica ou seja, se a data do registro foi dia 11/07/2012 feita pelo usuario Carlos, ele ignora e traz a data do dia 07/07/2012 que foi feita pelo usuario Paulo pois Paulo é maior que carlos.

    Caso eu deixe sem o MAX ele duplica as linhas ou seja traz o Carlos e o Paulo, so que eu preciso apenas do ultimo funcionario com a data mais alta.

    O comando que eu fiz foi o seguinte:

    SELECT DISTINCT

     dbo.tblWRIRecepcao.PK_Recepcao AS Recepcao, dbo.tblWRIRecepcao.DtRecep AS Data_Recepcao, MAX(DATEDIFF(dd, tblWRIRecepcao.DtRecep, dbo.tblWRIAndamentos.Data)) AS QTD_Dias_Sem_Registro,

    MAX(dbo.tblSIPUsuarios.NomeUser) AS Funcionario

    FROM         dbo.tblWRIAndamentos INNER JOIN

                          dbo.tblWRIRecepcao ON dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao INNER JOIN

                          dbo.tblWRITitulos ON dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao AND

                          dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao INNER JOIN

                          dbo.tblSIPUsuarios ON dbo.tblSIPUsuarios.IDUser = dbo.tblWRIAndamentos.FK_tblWRIUsuarioOrigem_Id

                         

    WHERE  (dbo.tblWRIRecepcao.DtRecep >= GETDATE() - 31) AND (dbo.tblWRIRecepcao.DataUltimaReentrada IS NULL) AND (dbo.tblWRITitulos.DtDevolucao IS NULL) AND

                          (dbo.tblWRITitulos.DataUltimoRegistro IS NULL) AND (dbo.tblWRIRecepcao.DtCancelamento IS NULL) AND (dbo.tblWRITitulos.DtRetirada IS NULL) AND

                          (dbo.tblWRIRecepcao.TipoPrenotacao = 1) AND (dbo.tblWRIRecepcao.PK_FlagRecepcaoAnterior IS NULL) AND (DATEDIFF(dd, dbo.tblWRIRecepcao.DtRecep,

                          dbo.tblWRIAndamentos.Data) >= 13) AND (YEAR(dbo.tblWRIRecepcao.DtRecep) = YEAR(GETDATE()))

    GROUP BY dbo.tblWRIRecepcao.PK_Recepcao, dbo.tblWRIRecepcao.DtRecep

    ORDER BY Recepcao

    Desta forma acima sairia por exemplo assim:

    239088  2012-06-22 16:39:00       31           Paulo

    Reparem que a data é do dia 22/06/2012 com o usuario carlos

    Porem se eu retirar o MAX

    Sae desta forma:

    239088  2012-06-23 16:39:00       31           Carlos

    239088  2012-06-22 16:39:00       31           Paulo

    Ou seja ele deveria me trazer o carlos apenas, pois esta com a maior data, mas ele traz o paulo pois o nome é "maior" que carlos.

    Se alguem puder me dar uma dica como saio disso, agradeço.

    Abs a todos


    • Editado Rafael-Santos segunda-feira, 23 de julho de 2012 17:55 acres
    •  

Todas as Respostas

  • terça-feira, 24 de julho de 2012 14:43
     
     

    Bom dia, Rafael.

    Se quer a data mais alta então utilize o MAX() na data e não no nome.

    []'s


    Danilo Oliveira www.coffeeandcodes.com.br

  • terça-feira, 24 de julho de 2012 14:46
     
     

    Quando eu retiro o MAX do nome ele duplica as linhas, aparecem varios usuarios no mesmo numero de protocolo, que é o primeiro campo que eu coloquei no exemplo.

    Se eu coloco o MAX no nome, ele nao duplica porem ele nao traz o ultimo nome, ele traz o maior nome em ordem alfabetica.

  • terça-feira, 24 de julho de 2012 14:57
     
     
    Mesmo colocando o MAX() na data e alterando o groug by?

    Danilo Oliveira www.coffeeandcodes.com.br

  • terça-feira, 24 de julho de 2012 14:58
     
     
    Não sei se vou te ajudar, mas as vezes uso o order by x desc para aparecer o ultimo resultado, no seu caso poderia ser ORDER BY Recepcao,data desc.
  • terça-feira, 24 de julho de 2012 15:08
     
      Contém Código

    Rafael, tente fazer da seguinte forma:

    SELECT DISTINCT
    	dbo.tblWRIRecepcao.PK_Recepcao AS Recepcao
    	, MAX(dbo.tblWRIRecepcao.DtRecep) AS Data_Recepcao
    	, MAX(DATEDIFF(dd, tblWRIRecepcao.DtRecep, dbo.tblWRIAndamentos.Data)) AS QTD_Dias_Sem_Registro
    	, dbo.tblSIPUsuarios.NomeUser AS Funcionario
    	FROM
    		dbo.tblWRIAndamentos
    		INNER JOIN dbo.tblWRIRecepcao
    		ON dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao
    		INNER JOIN dbo.tblWRITitulos
    		ON dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao AND dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao
    		INNER JOIN dbo.tblSIPUsuarios 
    		ON dbo.tblSIPUsuarios.IDUser = dbo.tblWRIAndamentos.FK_tblWRIUsuarioOrigem_Id
    	WHERE  
    		(dbo.tblWRIRecepcao.DtRecep >= GETDATE() - 31) 
    	AND (dbo.tblWRIRecepcao.DataUltimaReentrada IS NULL) 
    	AND (dbo.tblWRITitulos.DtDevolucao IS NULL) 
    	AND (dbo.tblWRITitulos.DataUltimoRegistro IS NULL) 
    	AND (dbo.tblWRIRecepcao.DtCancelamento IS NULL) 
    	AND (dbo.tblWRITitulos.DtRetirada IS NULL) 
    	AND (dbo.tblWRIRecepcao.TipoPrenotacao = 1) 
    	AND (dbo.tblWRIRecepcao.PK_FlagRecepcaoAnterior IS NULL) 
    	AND (DATEDIFF(dd, dbo.tblWRIRecepcao.DtRecep, dbo.tblWRIAndamentos.Data) >= 13) 
    	AND (YEAR(dbo.tblWRIRecepcao.DtRecep) = YEAR(GETDATE()))
    GROUP BY 
    	dbo.tblWRIRecepcao.PK_Recepcao
    	, dbo.tblSIPUsuarios.NomeUser

    []'s


    Danilo Oliveira www.coffeeandcodes.com.br

    • Marcado como Resposta Harley AraujoOwner quarta-feira, 25 de julho de 2012 20:48
    • Não Marcado como Resposta Rafael-Santos segunda-feira, 30 de julho de 2012 19:57
    •  
  • segunda-feira, 30 de julho de 2012 20:03
     
     Respondido

    Meu problema é complicado ( pelo menos pra mim)

    Vejam o exemplo abaixo:

    Protocolo            Data                      Dias        Funcionario          Data_Andamento

    239651       2012-07-10 11:06:00     17           Michele          2012-07-27 14:33:54.783

    Todos os dados estao corretos menos o funcionario, nesse protocolo passou por varios usuarios e o ultimo se chama Fabiana, ele trouxe o ultimo pelo maior valor do nome, ou seja pelo MAX, as datas estao corretas, o campo dias, etc, so que ele pega pelo nome do maior funcionario que e eu preciso que traga pela maior data ( data Andamento) so que traga o funcionario relacionado a essa ultima data ( data andamento)

    O correto seria isso:

    Protocolo            Data                      Dias        Funcionario          Data_Andamento

    239651       2012-07-10 11:06:00     17           Fabiana         2012-07-27 14:33:54.783

    o comando é esse abaixo:

    SELECT 

    DISTINCT

    max(dbo.tblWRIRecepcao.PK_Recepcao) AS Recepcao, max(dbo.tblWRIRecepcao.DtRecep) AS Data_Recepcao,

    MAX(DATEDIFF(dd, tblWRIRecepcao.DtRecep, dbo.tblWRIAndamentos.Data)) AS Dias,

    max 

    (tblSIPUsuarios.NomeUser) as Funcionario, max(tblWRIAndamentos.Data) as Data_Andamento

    FROM dbo.tblWRIAndamentos INNER JOIN

    dbo

    .tblWRIRecepcao ON dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao INNER JOIN

    dbo

    .tblWRITitulos ON dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao AND

    dbo

    .tblWRIRecepcao.PK_Recepcao = dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao INNER JOIN

    dbo

    .tblSIPUsuarios ON dbo.tblSIPUsuarios.IDUser = dbo.tblWRIAndamentos.FK_tblWRIUsuarioOrigem_Id

    WHERE

    (dbo.tblWRIRecepcao.DtRecep >= GETDATE() - 31)

    AND (dbo.tblWRIRecepcao.DataUltimaReentrada IS NULL)

    AND (dbo.tblWRITitulos.DtDevolucao IS NULL)

    AND (dbo.tblWRITitulos.DataUltimoRegistro IS NULL)

    AND (dbo.tblWRIRecepcao.DtCancelamento IS NULL)

    AND (dbo.tblWRITitulos.DtRetirada IS NULL)

    AND (dbo.tblWRIRecepcao.TipoPrenotacao = 1)

    AND (dbo.tblWRIRecepcao.PK_FlagRecepcaoAnterior IS NULL)

    AND (DATEDIFF(dd, dbo.tblWRIRecepcao.DtRecep, dbo.tblWRIAndamentos.Data) >= 13)

    AND (YEAR(dbo.tblWRIRecepcao.DtRecep) = YEAR(GETDATE()))

    group 

    by tblWRIRecepcao.PK_Recepcao

    order 

    by Recepcao

    • Marcado como Resposta Rafael-Santos quarta-feira, 1 de agosto de 2012 16:21
    •