Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Kadu Oliveira

Consulta avançada com datas SQL

Recommended Posts

Amigos,

 

Me deparei com um problema que já estou tentando resolver há dias...

 

Tenho duas tabelas:

 

BD:

 

 

 

| Cliente | Matricula | Data |Status |
+------------+------------+--------------+---------+
| Cliente B | 1234 | 01/01/2013 |prata |
| Cliente B | 1234 | 05/04/2013 |ouro |
| Cliente B | 1234 | 06/04/2013 |bronze |

 

 

BASE:

 

 

 

| Cliente | Matricula | Produto | Data |
+-----------+------------+-----------+----------------+
| Cliente A | 5132 | abc | 01/12/2012 |
| Cliente B | 1234 | rgr | 05/04/2013 |
| Cliente B | 1234 | ghyh | 15/08/2013 |
| Cliente B | 1234 | fgr | 01/05/2013 |
| Cliente B | 1234 | bca | 01/04/2013 |
| Cliente C | 3210 | dfd | 01/01/2013 |

 

 

 

Na tabela BD tenho um histórico do status que cada cliente adquiriu de acordo com o tempo (por exemplo, até 01/01 o cliente B foi Prata, entre 02/01 e 05/04 foi ouro e de 06/04 em diante bronze)

 

Na tabela BASE tenho todas as transações que ele fez ao longo do tempo.

 

Preciso trazer todos os campos da BASE e incluir qual era o status dele na data da transação.

 

 

Abraços!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu faria uma function que receberia matricula e data,

 

esta leria BD localizando a maior data menor ou igual a data do parametro

 

retornaria o status.

 

As queries em questão usariam a function para obter o status de uma matricula numa data.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Complementando a dica do Motta, um cláusula que você pode usar é a CROSS APPLY,

 

http://technet.microsoft.com/pt-br/library/ms175156(v=sql.105).aspx

 

Se a tabela armazena a data na qual o cara adquiriu o status uma função seria

 

 

select '' from base cross apply dbo.datastatus (base.clienteid, base.data) as datastatus

 

 

create function dbo.datastatus (

@data date

,@cliente varchar(xx)) returns @tb table (Matricula varchar(100), Data date ,Status varchar(100))

 

insert into @tb

(Matricula , Data ,Status)

select top 1

Matricula , Data ,Status

from bd where where clienteId = @clienteID and data >= @data order by data

 

 

-- a consulta seria

Compartilhar este post


Link para o post
Compartilhar em outros sites

Amigos, Obrigado pela ajuda! Tentarei utilizar a function

 

Existe outra forma de obter essa query de forma mais simplificada? Pergunto pois precisarei utilizar essa lógica também em access.

 

Um abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em access creio que vc terá um problema, o sql do access é bem limitado que saiba.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Em access creio que vc terá um problema, o sql do access é bem limitado que saiba.

 

verdade, acabei esbarrando nesse problema. As consultas precisam ser bem simples pra rodar no access.

 

Se eu inserir a data inicial e final na tabela BD, é possível utilizar o between de alguma forma?

Compartilhar este post


Link para o post
Compartilhar em outros sites

tenho a sorte de ter trabalhado pouco com access ...

realmente conheço pouco.



Talvez a solução aqui seja via programação

 

 

Ler o status numa data >> variável
Fazer a query 
Montar os dados

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não seria isso?

 

Select

Cliente,Matricula,Produto,Data,

CASE

WHEN CONVERT(DATETIME,DATA,103) = '2013-01-01 00:00:00' THEN 'PRATA'

WHEN CONVERT(DATETIME,DATA,103) BETWEEN '2013-01-02 00:00:00' AND '2013-04-05 00:00:00' THEN 'PRATA'

ELSE 'BRONZE' END

from BASE

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.