Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Preciso trazer o 'último' registro da TABELA 2 que tenha a data menor do que o meu registro da TABELA 1
TABELA1
02/01/17
03/01/17
06/01/17
TABELA2
01/01/17
03/01/17
04/01/17
05/01/17
PRECISO DO SEGUINTE resultado:
TABELA1 TABELA2
02/01/17 01/01/17
03/01/17 01/01/17
06/01/17 05/01/17
O código que estou utilizando está desprezando os dois primeiros resultados do exemplo porque tem casos em que a maior data da TABELA2 é maior do que a data do registro da TABELA1, o que não satisfaz a condição TABELA2.DATA < TABELA1.DATA
EXEMPLO DO CODIGO:
Select *campos *
from TABELA1
left join TABELA2 ON TABELA1.COD = TABELA2.COD
WHERE
tabela2.DATA = ( select max(temp.DATA)
from tabela2 as temp
where (tabela1.DATA)>temp.DATA)
Como resolver???Tem muitos dados nas 2 tabelas.
A união é feita através do código do produto.
Eu trago todos os registros da TABELA1 e preciso achar uma serie de dados da TABELA2 que contenha a maior data que seja menor do que a data do registro da TABELA1.
Publica a estrutura das tabelas e seus relacionamentos.
'
Tentei da forma abaixo também, mas demora muito pra rodar e se o periodo é grande, trava.
Mas com esse código eu consegui trazer mais registros, aqueles que tinham sido ignorados no código anterior.
(Alguma dica pra otimizar a consulta??)
SELECT STRAIGHT_JOIN
a.id AS ID_SAIDA,DATA_SAIDA,A.NOTA,A.CNPJ AS CNPJ, A.NOME_CLIENTE,
A.REFERENPRODUTO,A.PRODUTO,A.NCM,A.CFOP,D.UNID,A.QTDE,D.EMB_QTDE,A.VLR_UNITARIO,A.VLR_TOTAL,
C.ENTRADA_ID AS ID_ENT, C.ns1_dhEmi AS DATA_ENT, ns1_nNF AS NF_ENT,ns1_CNPJ AS CNPJ,
ns1_xNome AS FORNECEDOR,ns1_cProd AS COD,ns1_xProd AS PRODUTO,ns1_NCM AS NCM,ns1_CFOP AS CFOP,
round(replace(ns1_qCom,',','.'),5) AS QTDE,E.EMB_QTDE,ns1_vUnCom AS VL_UNI,
ns1_vProd AS VL_TOTAL,ns1_vDesc AS DES,C.ns1_vBC AS VBC,ns1_vICMS AS ICMS,ns1_pICMS/100 AS INTER,ns1_vIPI,ns1_vFrete,ns1_vOutro,ns1_vSeg,
MVA/100 AS MVA, ALIQ_INTRA/100 AS INTRA,round(RED_BC/100,5) as REB_BC,round(ALIQ_INTRA/100*(1-RED_BC/100),5) as ALIQ_INTRA_Red,
ROUND(CASE WHEN C.ns1_qCom=0 THEN 0
ELSE
CASE WHEN (c.ns1_pICMS)>e.ALIQ_INTRA*(1-e.RED_BC) THEN
((C.ns1_vBC+C.ns1_vIPI)*(0.7*e.MVA/100)*(e.ALIQ_INTRA/100*(1-e.RED_BC/100))/(C.ns1_qCom*e.EMB_QTDE))*A.QTDE*d.EMB_QTDE
ELSE
(((C.ns1_vBC+C.ns1_vIPI)*(0.7*e.MVA/100)*((1-c.ns1_pICMS/100)/(1-e.ALIQ_INTRA/100*(1-e.RED_BC/100)))*(e.ALIQ_INTRA/100*(1-e.RED_BC/100))/(C.ns1_qCom*e.EMB_QTDE))*A.QTDE*d.EMB_QTDE)
END
END,2) as CALCULO
FROM
TB_SAIDAS AS a
left JOIN TB_CADASTROATIVO AS B ON a.CNPJ = B.CA_CNPJ
LEFT JOIN TB_PRODUTOS AS d ON a.REFERENPRODUTO = d.REFERENPRODUTO
LEFT JOIN TB_PRODUTOS_ent AS e ON d.COD_PRODUTO_FORN = e.COD_PRODUTO_FORN and d.REFERENPRODUTO = e.REFERENPRODUTO
LEFT JOIN TB_ENTRADAS AS C ON (D.CNPJ_FORN = C.ns1_CNPJ or D.CNPJ_FORN2 = C.ns1_CNPJ or D.CNPJ_FORN3 = C.ns1_CNPJ) AND (d.COD_PRODUTO_FORN = C.ns1_cProd)
WHERE
** C.ns1_dhEmi = ( select max(ent.ns1_dhEmi)
from tb_entradas as ent
where (e.COD_PRODUTO_FORN = ent.ns1_cProd) And (a.DATA_saida)>ent.ns1_dhEmi And (E.CNPJ_FORN=ent.ns1_CNPJ or E.CNPJ_FORN2=ent.ns1_CNPJ or D.CNPJ_FORN3 = ent.ns1_CNPJ))**
GROUP BY
a.id,DATA_SAIDA,A.NOTA,A.CNPJ, A.NOME_CLIENTE,
A.REFERENPRODUTO,A.PRODUTO,A.NCM,A.CFOP,D.UNID,A.QTDE,D.EMB_QTDE,A.VLR_UNITARIO,A.VLR_TOTAL1) Que índices tem TB_ENTRADAS ?
___Talvez um por produto e data
2) tente também
WHERE
** C.ns1_dhEmi = ( select max(ent.ns1_dhEmi)
from tb_entradas as ent
where (ent.ns1_cProd = e.COD_PRODUTO_FORN) And (ent.ns1_dhEmi <= a.DATA_saida) And (E.CNPJ_FORN= or ent.ns1_CNPJ=E.CNPJ_FORN2 orent.ns1_CNPJ = D.CNPJ_FORN3 ))**
**ou seja inverter a ordem do "where" **Vou tentar inverter a ordem!!
Minhas tabelas não tem chave estrangeira, devo criar??
Sim , garante a integridade e otimiza o acesso.
Obrigada!!!
São só datas ? Não tem nenhuma chave amarrando isto ?