2012-06-13 4 views
1

J'ai deux tables, à savoir la liste des prix (tableau A) et ordonnance Enregistrement (tableau B)Comment identifier pour corriger la ligne

Tableau A

SKU Offer Date Amt 
AAA 20120115 22 
AAA 20120223 24 
AAA 20120331 25 
AAA 20120520 28 

Tableau B

Customer SKU Order Date 
A001  AAA 20120201 
B001  AAA 20120410 
C001  AAA 20120531 

Je dois récupérer le prix correct pour chaque client en fonction de la date de la commande. La sortie attendue devrait être comme ceci: -

Customer SKU Order Date Amt 
A001  AAA 20120201 22 
B001  AAA 20120410 25 
C001  AAA 20120531 28 

Merci.

+0

Rien. Je ne sais pas comment faire la sélection de la plage de dates. – Bob

+2

Comment savez-vous quelle ligne de la table A va avec quelle ligne de la table B? –

+0

Comment avez-vous produit le résultat souhaité? Je ne suis pas capable de comprendre la logique derrière cela. Sur quelle colonne des deux tables vous allez vous joindre? – manurajhada

Répondre

2

une jointure gauche (ou NOT EXISTS sous-requête) peut être utilisé pour faire en sorte que la La jointure entre les deux tables utilise la ligne "plus récente" de la table des prix datée à la date de la commande ou avant celle-ci. Je suppose que c'est la relation entre les tables que vous souhaitez atteindre:

Configuration:

create table Prices (
    SKU char(3) not null, 
    OfferDate date not null, 
    Amt int not null 
) 
go 
insert into Prices (SKU, OfferDate, Amt) values 
('AAA','20120115', 22), 
('AAA','20120223', 24), 
('AAA','20120331', 25), 
('AAA','20120520', 28) 
go 
create table Orders (
    Customer char(4) not null, 
    SKU char(3) not null, 
    OrderDate date not null 
) 
go 
insert into Orders (Customer, SKU, OrderDate) values 
('A001','AAA','20120201'), 
('B001','AAA','20120410'), 
('C001','AAA','20120531') 
go 

Requête:

select 
    o.*, /* TODO - Explicit columns */ 
    p.Amt 
from 
    Orders o 
     inner join 
    Prices p 
     on 
      o.SKU = p.SKU and 
      o.OrderDate >= p.OfferDate 
     left join 
    Prices p_later 
     on 
      o.SKU = p_later.SKU and 
      o.OrderDate >= p_later.OfferDate and 
      p_later.OfferDate > p.OfferDate 
where 
    p_later.SKU is null 
+0

Merci, ça marche. – Bob

1

La prochaine fois, ne mettez en place ce que u ont essayé ....

de toute façon, voici votre réponse! essayez ...

Select X.Customer , X.SKU , X.OrderDate , Y.Amt from B as X INNER JOIN A as Y ON X.Order Date= Y. Offer Date 

bonne chance ...

+0

Les valeurs 'OrderDate' ne correspondent pas nécessairement aux valeurs' OfferDate', pour autant que je puisse le voir. J'ai également supposé que (bien que cela ne figure pas dans les exemples de données), les tables contiennent des informations relatives à plus d'un «SKU». –

+0

@Zoya, comment savez-vous que la jointure souhaitée s'applique sur les colonnes de date? et 'X.Ordre Date = Y. Date de l'offre' cela produira-t-il le résultat souhaité, puisqu'il n'y a pas de daté commun dans les deux tableaux? – manurajhada

+0

oui, je suis désolé je pensais que c'était pareil ... – Zoya

1
SELECT o.Customer, o.SKU, o.[Order Date], 
    (SELECT TOP 1 l.Amt 
    FROM PriceList l 
    WHERE l.[Offer Date] <= o.[Order Date] AND o.SKU = l.SKU 
    ORDER BY l.[Offer Date] DESC) AS Amount 
FROM 
Orders o 

Certaines choses peuvent varier en fonction du soutien de base de données

Questions connexes