Jump to content

[Resolvido] count Datediff


jafm
 Share

Recommended Posts

Boas,

tou aqui a ter uma dificuldade em obter o count da idade, ou seja, eu calculo a idade de cada pessoa, mas agora querias contar quantos tem 10anos, 12anos, por ai fora... so que nao estou a conseguir. A query que estou a usar é:

SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
FROM Cliente INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
where DATEDIFF(YEAR,Data,GETDATE()) >'1'
group by Nome order by Anos asc
Edited by jafm
Link to comment
Share on other sites

Experimenta:

SELECT Nome, TIMESTAMPDIFF(YEAR,Data,CURDATE()) as Anos
FROM Cliente INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
where DATEDIFF(YEAR,Data,GETDATE()) >'1'
group by Nome order by Anos asc

PS: Não acho boa ideia teres uma coluna chamada Data, visto ser uma palavra reservada...

Edited by KiNgPiTo
Link to comment
Share on other sites

Olá,

Podes usar uma função para te retornar a idade, desta forma poderá ser utilizada em mais do que uma query, assim:

CREATE FUNCTION [dbo].[idade]
(
@Data DATETIME
)
RETURNS INT
BEGIN
DECLARE @Idade INT;

SET @Idade = DATEDIFF(yy, @Data, GETDATE())
- CASE WHEN datepart  (mm, @Data) <= DATEPART(mm, GETDATE()) and DATEPART(dd, @Data) <= DATEPART(dd, GETDATE())
  THEN 0
  ELSE 1
  END;

RETURN @Idade;
END

Exemplos de utilização:

PRINT [dbo].[idade]('19760625');
PRINT [dbo].[idade]('19760626');
PRINT [dbo].[idade]('19760627');

Depois é só utilizares na tua query, desta forma:

SELECT Nome, [dbo].[idade](Data) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON CartãoCliente.id = CartãoClienteMovimentos.Id
HAVING Anos > 1
GROUP BY Nome
ORDER BY Anos ASC;

Espero ter ajudado,

Edited by Rechousa

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

podes fazer assim:

SELECT COUNT(DATEDIFF(MONTH,DataNascimento,GetDate())),DATEDIFF(MONTH,DataNascimento,GetDate()) 
FROM Users
GROUP BY DATEDIFF(MONTH,DataInicio,GetDate())
HAVING DATEDIFF(MONTH,DataNascimento,GetDate())>1

Por muito mais que que estude só aprendo uma coisa, que ainda tenho muita coisa para aprender.

A beleza de um código está em decompor problemas complexos em pequenos blocos simples.

"learn how to do it manually first, then use the wizzy tool to save time."

"Kill the baby, don't be afraid of starting all over again. Fail soon, learn fast."

Link to comment
Share on other sites

Rechousa, Tive a experimentar a tua ajuda,

SELECT Nome, [dbo].[idade](DATA) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON Cliente.id = ClienteMovimentos.Id
HAVING Anos > 1
GROUP BY Nome
ORDER BY Anos ASC;

dá erro Incorrect syntax near the keyword 'group'

trouquei a ordem do having pelo group by

trocando diz me que Invalid column name 'Anos'

Link to comment
Share on other sites

Desculpa,

Escrevi o código sem testar :)

Este deverá funcionar:

SELECT Nome, MAX([dbo].[idade](DATA)) AS Anos
FROM Cliente
INNER JOIN ClienteMovimentos ON Cliente.id = ClienteMovimentos.Id
WHERE [dbo].[idade](DATA) > 1
GROUP BY Nome
ORDER BY Anos ASC;

Espero ter ajudado,

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

Rechousa, dessa maneira fica como eu tinha inicialmente na minha query, não me conta quantos clientes tem 12anos,

assim só me dá a idade de cada cliente

Link to comment
Share on other sites

Ooops :)

Então, para tal não deverás precisar de aceder à tabela ClienteMovimentos, ou precisas? Não chega verificar a idade do cliente, agrupá-las e fazer o SUM ?

Assim:

SELECT [dbo].[idade](DATA) AS Idade, COUNT(1) AS Contador
   FROM Cliente
   WHERE [dbo].[idade](DATA) > 1
   GROUP BY [dbo].[idade](DATA)
   ORDER BY Idade ASC;

Pedro Martins

Sharing is Knowledge!

http://www.linkedin.com/in/rechousa

Link to comment
Share on other sites

Sim neste caso vou retirar a tabela cliente, pois o objectivo é saber à quanto tempo aquele cliente não faz movimentos

Só que o resultado não é o esperado

aparece algo como

Idade Contador

2 1

2 1

2 2

2 1

2 1

e por ai fora

Link to comment
Share on other sites

usando a tua query:

SELECT Anos, count(*) AS qt
FROM (SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
FROM Cliente
INNER JOIN ClienteMovimentos
ON CartãoCliente.id = CartãoClienteMovimentos.Id
WHERE DATEDIFF(YEAR,Data,GETDATE()) > 1
group by Nome) AS clientes
GROUP BY Anos
ORDER BY Anos ASC

simplificando a leitura com CTE:

WITH clientes AS (SELECT Nome, DATEDIFF(YEAR,Max(Data),GETDATE()) as Anos
	 FROM Cliente
	 INNER JOIN ClienteMovimentos
	 ON CartãoCliente.id = CartãoClienteMovimentos.Id
	 WHERE DATEDIFF(YEAR,Data,GETDATE()) > 1
	 group by Nome)
SELECT Anos, count(*) AS qt
FROM clientes
GROUP BY Anos
ORDER BY Anos ASC
Edited by xBoShY
Link to comment
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.