Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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!
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.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
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!
Em access creio que vc terá um problema, o sql do access é bem limitado que saiba.
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?
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
Entendi. Obrigado pela ajuda, vou testar essas opções.
Abraço!
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
Consegui utilizando o between, colocando na tabela BD a data de inicio e fim de cada status.
Obrigado a todos pela ajuda!
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.