2012-02-09 5 views
1

J'ai une table avec des prix d'un produit qui change tous les jours, permet de direTSQL Joignez-vous sur des colonnes avec des valeurs différentes

prix

(productID int, float prix, dateprice datetime).

Ces prix n'existent pas le week-end, donc il n'y a pas tous les jours des prix sur la table.

Je voudrais un résultat avec un productId, day, todayPrice, hierPrice (évidemment la première date ne figurerait pas sur ce résultat, puisqu'il n'a pas de jour précédent). J'ai pensé qu'une telle inscription me donnerait ce que je veux, mais n'a pas fonctionné.

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price pr ON pr.productId = p1.productId 
inner join price p2 ON p1.dateprice = (select max (p.dateprice) 
             from price p 
             where p.dateprice < p1.dateprice) 

Cette sélection retour un résultat vide, mais si je l'utilise « = » au lieu de « < » il me renvoie une table avec beaucoup de lignes égales (comme prévu).

Comment me suggérez-vous de sélectionner cette information?

+0

Vous ne faisaient pas référence 'p2' dans votre clause' ON'. – HABO

+0

Après l'édition ... je ne suis pas sûr de ce que 'pr' fait. Pourquoi joindre de 'p1' à' pr'? –

Répondre

1

Vous étiez proche .. mais si vous joignez le prix d'un produit au prix précédent, vous voudrez vous assurer que vous incluez l'ID du produit, sinon vous rejoindriez tout autre produit prix.

En outre, si p2 est le prix de la veille ... c'est la date que vous vérifiez trouver le max (p.dateprice) qui est inférieur à p1.dateprice.

select 
    p1.productId, p1.dateprice, 
    p1.price as todayPrice, p2.price as yesterdayPrice 
from price p1 
inner join price p2 
    on p1.productId = p2.productId 
    and p2.dateprice = (
     select max (p.dateprice) 
     from price p 
     where 
      p.dateprice < p1.dateprice 
      and p.productId = p1.productId 
    ) 
+0

Merci, mon frère, mais j'ai oublié d'afficher la première condition ON, le productId. C'était sur ma requête originale, mais malgré cela, la requête ne fonctionne toujours pas. Je viens d'éditer le post original. – user1200835

1

Vous êtes dans la bonne voie, il suffit de changer votre condition de jointure, comme ceci:

select p1.productId, p1.dateprice, p1.price, p2.price 
from price p1 
inner join price p2 ON p1.productId = p2.productId AND p1.dateprice = DATEADD(day, -1, p2.dateprice) AND p2.dateprice = CONVERT(VARCHAR, GETDATE()) 

Le CONVERT sur GETDATE() est utilisé pour tronquer le datetime, en supposant que votre dateprice a déjà tronqué datetimes, que est, avec l'heure à 12:00 AM. Sinon, vous devrez utiliser CONVERT pour le faire. Si vous souhaitez utiliser MAX() au lieu d'obtenir le dernier, vous feriez mieux d'utiliser CROSS APPLY:

select p1.productId, p1.dateprice, p1.price, p2.price 
    from price p1 
    CROSS APPLY (select TOP 1 p.price 
FROM price p WHERE p.productId = p1.productId ORDER BY p.dateprice DESC) p2 
Questions connexes