View Full Version : SQL


pascasso
09-11-2007, 23:31
boas,

existem algum statement de SQL que nos dê linhas onde um valor numa linha se repete?
Isto é, imaginem que eu tenho:

ID NOME DATA DE NASC.

4 João Miguel 12/12/1988
5 Jorge Álvaro 12/12/1988
6 Luís Almeida 23/11/1956

Agora imaginem isto com 7678 linhas... o que eu queria saber era se havia por exemplo, uma data de nascimento repetida... eu nao lhe estou a perguntar para me mostrar pessoas com uma determinada data de nascimento dada por mim, quero apenas saber se existem datas de nascimento repetidas... entre 7678 resultados...

nsilvio
10-11-2007, 00:05
boas,

existem algum statement de SQL que nos dê linhas onde um valor numa linha se repete?
Isto é, imaginem que eu tenho:

ID NOME DATA DE NASC.

4 João Miguel 12/12/1988
5 Jorge Álvaro 12/12/1988
6 Luís Almeida 23/11/1956

Agora imaginem isto com 7678 linhas... o que eu queria saber era se havia por exemplo, uma data de nascimento repetida... eu nao lhe estou a perguntar para me mostrar pessoas com uma determinada data de nascimento dada por mim, quero apenas saber se existem datas de nascimento repetidas... entre 7678 resultados...

SELECT DATA_DE_NASC, COUNT(DATA_DE_NASC) FROM [TABELA] GROUP BY DATA_DE_NASC

slack_guy
10-11-2007, 11:50
Se queres saber quantas (e não quais) datas repetidas existem, podes fazer assim:

SELECT
(
SELECT
COUNT(data_nasc)
FROM
minha_tabela
)
-
(
SELECT
COUNT(DISTINCT data_nasc)
FROM
minha_tabela
) AS repetidas;

O resultado seria qualquer coisa como:

repetidas
-----------
175
(1 row)

pascasso
10-11-2007, 13:58
Eu queria mesmo saber quais...
e queria que o resultado fosse mais ou menos assim:

baseado-me na tabela anterior, se eu pedisse por repetidas queria que me desse isto:

ID NOME DATA DE NASC.

4 João Miguel 12/12/1988
5 Jorge Álvaro 12/12/1988

E se houvesse mais repetidos ele ordenava assim, por exemplo:

ID NOME DATA DE NASC.

4 João Miguel 12/12/1988
5 Jorge Álvaro 12/12/1988
7 Pedro Vales 11/2/1966
23 Nuno Costa 11/2/1966
443 Claúdia Azevedo 11/2/1966
756 Rita Mendes 7/5/1961
833 Rodrigo Leitão 7/5/1961

Apesar da ordem de a data de nascimento estar decrescente e a ordem dos ID's estar crescente não quer dizer nada foi apenas registos inventados agora.

slack_guy - Usaste aí o MySQL, esse statement também pode ser usado para Access?

slack_guy
10-11-2007, 14:21
slack_guy - Usaste aí o MySQL, esse statement também pode ser usado para Access?
No meu exemplo testei com PostgreSQL, mas qualquer SGBD que permita subselects permite o mesmo. Quanto ao Access, desconheço.

spastikman
10-11-2007, 14:54
Funciona em qualquer SGBD que use o standard SQL 2003. Access penso que cumpre os requisitos.

kzip
10-11-2007, 16:23
Para retornar as linhas em que há datas repetidas basta:
SELECT ID, NOME, DATA
FROM TABELA
WHERE DATA IN
(SELECT DATA
FROM TABELA
GROUP BY DATA
HAVING COUNT(*) >1
)


Se também quiseres saber quantas vezes aparece cada data repetida, então:

SELECT A.ID, A.NOME, A.DATA, B.QT
FROM TABELA AS A
INNER JOIN (
SELECT DATA,COUNT(*) AS QT
FROM TABELA
GROUP BY DATA
HAVING COUNT(*) >1) AS B
ON A.DATA=B.DATA

pascasso
11-11-2007, 13:24
boas,

grande obrigado a todos. Vou experimentar os vossos exemplos, já digo qualquer coisa.