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:57Mesmo 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:58Nã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
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
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
DISTINCTmax(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_AndamentoFROM dbo.tblWRIAndamentos INNER JOIN
dbo
.tblWRIRecepcao ON dbo.tblWRIRecepcao.PK_Recepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao INNER JOINdbo
.tblWRITitulos ON dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao = dbo.tblWRIAndamentos.FK_tblWRIRecepcaoRecepcao ANDdbo
.tblWRIRecepcao.PK_Recepcao = dbo.tblWRITitulos.FK_tblWRIRecepcaoRecepcao INNER JOINdbo
.tblSIPUsuarios ON dbo.tblSIPUsuarios.IDUser = dbo.tblWRIAndamentos.FK_tblWRIUsuarioOrigem_IdWHERE
(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_Recepcaoorder
by Recepcao- Marcado como Resposta Rafael-Santos quarta-feira, 1 de agosto de 2012 16:21

