jafm Posted May 28, 2013 at 08:33 PM Report #509476 Posted May 28, 2013 at 08:33 PM Boas, Estou a criar uma query, mas estou a tentar alguma dificuldade. O que eu queria era que ela me devolve-se os registos de um dado Cartão, que sofreu mais do que um movimento no dia de hoje? select Cliente.cod, Cliente.Nome, ClienteMovimento.ID, ClienteMovimento.Data ,DATEDIFF(day,Max(Data),GETDATE()) as DIA FROM Cliente INNER JOIN ClienteMovimento ON Cliente.cod = ClienteMovimento.Id where DATEDIFF(day,Data,GETDATE()) > '1' group by Cliente.cod, Cliente.Nome, ClienteMovimento.ID, ClienteMovimento.Data Com a query que tenho acima devolve-me todas as datas em que existiu mais do que um movimento numa determinada Data, mas que pretendia filtrar apenas no dia atual, ou semana!!!
legd1991 Posted May 28, 2013 at 09:31 PM Report #509490 Posted May 28, 2013 at 09:31 PM exprimenta assim: where CONVERT(VARCHAR(10),Data,10) = CONVERT(VARCHAR(10),GETDATE(),10) Vai retornar todos para o dia actual
nelsonr Posted May 28, 2013 at 09:56 PM Report #509493 Posted May 28, 2013 at 09:56 PM Deve ser isto: select * from ( select ClienteMovimento.ID, ClienteMovimento.Data, COUNT(*) as TotalMovimentos FROM ClienteMovimento GROUP BY ClienteMovimento.ID, ClienteMovimento.Data ) as Movimentos where Movimentos.TotalMovimentos>1 and Movimentos.Data = Convert(date, getdate())
jafm Posted May 28, 2013 at 10:34 PM Author Report #509506 Posted May 28, 2013 at 10:34 PM Boas, legd1991 e se eu quiser movimento por Mês? Nelsonr não consegui perceber a sua quety, como tirou o inner join nao vou conseguir interligar...
nelsonr Posted May 28, 2013 at 10:56 PM Report #509507 Posted May 28, 2013 at 10:56 PM Faltava apenas juntar a tabela de clientes SELECT cliente.cod, cliente.Nome, Movimentos.ID,Movimentos.Data FROM ( SELECT ClienteMovimento.ID, ClienteMovimento.DATA, COUNT(*) AS TotalMovimentos FROM ClienteMovimento GROUP BY ClienteMovimento.ID, ClienteMovimento.DATA ) AS Movimentos INNER JOIN Cliente ON Cliente.cod=Movimentos.ID WHERE Movimentos.TotalMovimentos>1 AND Movimentos.DATA = CONVERT(DATE, getdate()) Já agora, o clientemovimento.id é o mesmo que o cliente.cod? Convem dar nomes parecidos. Podias substituir o ID no ClienteMovimento por codCliente ou algo parecido. Se quiseres de um determinado mês, podes substituir o filtro da data por algo deste tipo (filtro para movimentos duplicados no mes 5) AND month(Movimentos.DATA)=5
jafm Posted May 29, 2013 at 01:55 PM Author Report #509588 Posted May 29, 2013 at 01:55 PM Boas, nelsonr não conseguir colocar a sua query a devolver o resultado pretendido.
nelsonr Posted May 29, 2013 at 02:46 PM Report #509598 Posted May 29, 2013 at 02:46 PM Então devo ter percebido mal o que pretendes. A query está a retornar a lista de clientes que tenham mais de um movimento no dia atual
jafm Posted May 29, 2013 at 02:59 PM Author Report #509599 Posted May 29, 2013 at 02:59 PM O que eu pretendo é isso mesmo. Eu não estou a conseguir perceber a construção da sua query...se calhar esse é tambem o problema WHERE Movimentos.TotalMovimentos>1 AND Movimentos.DATA = CONVERT(DATE, getdate()) é mesmo só movimentos e não ClientesMovimentos?
nelsonr Posted May 29, 2013 at 03:08 PM Report #509602 Posted May 29, 2013 at 03:08 PM Sim, "Movimentos" é a lista criada temporariamente ((...) AS Movimentos) Mas não chegaste a experimentar? Aqui funcionou corretamente
jafm Posted May 29, 2013 at 04:32 PM Author Report #509624 Posted May 29, 2013 at 04:32 PM Estive a ver outra alternativa... que penso que até seja mais simples. Só tenho uma duvida como faço para restringir os movimentos menor que 1 select top 1000 Count(Id)as total, id , Cliente.Nome_Completo, CartãoCliente.E_mail FROM CartãoCliente INNER JOIN ClienteMovimentos ON Cliente.cod_barras = ClienteMovimentos.Id where CONVERT(VARCHAR(5), data, 11) = CONVERT(VARCHAR(5), GETDATE(), 11) and not operação='1' and not operação='2' group by id, Cliente.Nome_Completo, Cliente.E_mail ou seja o "total" devolve me o total de movimentos, e eu gostaria de retirar os que apenas tem 1 movimentos.
legd1991 Posted May 29, 2013 at 05:08 PM Report #509632 Posted May 29, 2013 at 05:08 PM usa isto : having total = 1
jafm Posted May 29, 2013 at 05:31 PM Author Report #509635 Posted May 29, 2013 at 05:31 PM Eu tinha pensado nisso mas diz que total é uma coluna inválida...
legd1991 Posted May 29, 2013 at 05:41 PM Report #509637 Posted May 29, 2013 at 05:41 PM Mete o having Count(Id)=1
nelsonr Posted May 29, 2013 at 10:07 PM Report #509679 Posted May 29, 2013 at 10:07 PM Há ai qualquer coisa que não me parece bem nesse ultimo query. A tabela CartãoCliente está a ser utilizada mas não está relacionada com nenhuma das outras. É mesmo assim?
legd1991 Posted May 30, 2013 at 08:07 AM Report #509696 Posted May 30, 2013 at 08:07 AM Há ai qualquer coisa que não me parece bem nesse ultimo query. A tabela CartãoCliente está a ser utilizada mas não está relacionada com nenhuma das outras. É mesmo assim? Deves ter que por having count(ClienteMovimentos.Id)=1 porque suponho eu que as outras tabelas tem um campo com o mesmo nome
xBoShY Posted May 31, 2013 at 11:23 PM Report #510376 Posted May 31, 2013 at 11:23 PM (edited) Se Cliente.cod é o mesmo que ClienteMovimento.ID, porquê incluir os dois no resultado da consulta? SELECT Cliente.cod, Cliente.Nome, ClienteMovimento.[Data], count(*) as qt_movs FROM Cliente INNER JOIN ClienteMovimento ON Cliente.cod = ClienteMovimento.Id WHERE ClienteMovimento.[Data] = cast(CURRENT_TIMESTAMP as date) GROUP BY Cliente.cod, Cliente.Nome, ClienteMovimento.[Data] HAVING count(*) > 1 Edited May 31, 2013 at 11:24 PM by xBoShY
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now