• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

9 mensagens neste tópico

Tenho uma tabela (cod_tabela, cod_tipo, cod_pessoa, data)

exemplo:

---------------------------------------------------------------

cod_tabela| cod_tipo | cod_pessoa  |      data

---------------------------------------------------------------

      1                1                1              01/10/2006

      2                1                1              02/10/2006

      3                2                1              03/10/2006

      4                2                1              04/10/2006

      5                2                3              05/10/2006

      6                2                3              06/10/2006

queria seleccionar todos os registos com cod_tipo=1 e cod_tipo=2 com ultima data

resultado  :

-------------

cod_pessoa |    data tipo 1    |  data Tipo 2    |

        1            02/10/2006        04/10/2006

        3                                      06/10/2006

Não estou a ver como fazer :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

essa data tipo vem da onde ? aparece na nova tabela so ou vem de mais algum lado?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

essa data tipo vem da onde ? aparece na nova tabela so ou vem de mais algum lado?

Na minha tabela a coluna cod_tipo neste momento tem apenas valores 1 ou 2 

posso ter :

joao , 1 (cod_tipo) , 10-10-2006      (esta é a ultima data para esta pessoa e que o cod tipo é  1)

joao , 2 (cod_tipo) , 15-10-2006

joao , 2 (cod_tipo) , 16-10-2006    (esta é a ultima data para esta pessoa e que o cod tipo é  2)

na minha consulta iria aparecer a pessoa com a MAX(data) que esta a bold:

Nome    |  data tipo 1 |  data tipo 2

Joao        10-10-2006    16-10-2006

cumps;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tenta algo deste genero:

SELECT *
FROM tabela
WHERE (Cod_Tipo = 1 OR Cod_Tipo = 2) AND Data = MAX(Data)
GROUP BY Cod_Tipo
ORDER BY Cod_Tipo ASC

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tiago Salgado essa query da-me 1 erro:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

De qualquer modo penso que isso nao faz o que quero...

isso ia dar algo do genero e assim sei fazer:

Nome  | cod_tipo  |  data  tipo  1 ou 2    | 

Joao        1            10-10-2006   

Joao        2            16-10-2006

e eu queria:

Nome    |  data tipo 1 |  data tipo 2

Joao        10-10-2006    16-10-2006

Isto deve precisar de 2 selects ou coisa assim...

cumps :D

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é simples:

  • cria um array com os nome, data1 e data2...
  • começas a correr a base de dados, registo a registo e, se o nome já existe no array, verificas se a data (tipo 1 ou 2) é mais recente que a que está no vector do array e, se for, actualizas o vector, se não, passas ao seguinte... se não existe, crias um novo vector...
  • no fim, é só fazeres display dos vectores do array...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

é simples:

  • cria um array com os nome, data1 e data2...
  • começas a correr a base de dados, registo a registo e, se o nome já existe no array, verificas se a data (tipo 1 ou 2) é mais recente que a que está no vector do array e, se for, actualizas o vector, se não, passas ao seguinte... se não existe, crias um novo vector...
  • no fim, é só fazeres display dos vectores do array...

é simples:

  • cria um array com os nome, data1 e data2...
  • começas a correr a base de dados, registo a registo e, se o nome já existe no array, verificas se a data (tipo 1 ou 2) é mais recente que a que está no vector do array e, se for, actualizas o vector, se não, passas ao seguinte... se não existe, crias um novo vector...
  • no fim, é só fazeres display dos vectores do array...

obrigado por responderes ;)

Essa era uma das hipóteses no caso de haverem poucos registos...  neste caso estava a gastar recursos da maquina desnecessariamente.

Com sql isto tem de ir la :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ha, um caso clássico de transformação de dados e de esquema, em que as linhas são transformadas em colunas. ;)

Essa transformação não é muito complexa e é possível de ser feita usando SQL, se bem que a sua performance pode deixar um bocado a desejar.

Deixo aqui a solução, se bem que é possível que não funcione à primeira, pois não tive oportunidade de testar, mas o caminho é sem dúvida por aqui:

select t.cod_pessoa,
(select max(t1.data) from tabela t1
where t1.cod_pessoa = t.cod_pessoa and cod_tipo=1
) as data_tipo_1,
(select max(t2.data) from tabela t2
where t2.cod_pessoa = t.cod_pessoa and cod_tipo=2
) as data_tipo_1
from tabela t

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora