2014-06-06 3 views
-1

Je voudrais faire un rapport pour la boisson achetée en mois entier, mais le prix de la boisson peut changer à tout moment au cours du mois et je voudrais obtenir un rapport pour un mois avec changement de prixrequête SQL sur date

Je deux tables

SELECT [ID] 
     ,[DrinkID] 
     ,[UserID] 
     ,[qty] 
     ,[DateTaken] 
    FROM [Snacks].[dbo].[DrinkHistory] 

SELECT [ID] 
     ,[DrinkID] 
     ,[UserID] 
     ,[qty] 
     ,[DateTaken] 
    FROM [Snacks].[dbo].[DrinkHistory] 

[DrinkHistory]:

ID    DrinkID  UserID   qty   DateTaken 
----------------------------------------------------------------------  
1    1    1    1   2014-05-10 
2    1    1    2   2014-05-15 
3    2    1    1   2014-06-01 
4    2    1    4   2014-06-01 
5    1    1    3   2014-05-20 
6    1    1    4   2014-05-30 

[DrinkPricesEffect]:

PriceID  DrinkID   DrinkPrice  PriceEffectiveDate   IsCurrent 
----------------------------------------------------------------------------------- 
1    1    10.00    2014-05-01 1 
2    1    20.00    2014-05-20 1 
3    2    9.00    2014-06-01 1 
4    2    8.00    2014-01-01 1 
5    1    30.00    2014-05-25 1 
6    1    40.00    2014-05-28 1 

Je voudrais avoir comme résultat en date pris entre 01/05/2014 à 2014-05-31

DrinkId Qty Price DateTaken  PriceEffectiveDate 
----------------------------------------------------------------------- 
1 1  10  2014-05-10   2014-05-01 
1 2  10  2014-05-15   2014-05-01 
1 3 20  2014-05-20   2014-05-20 
1 4 40  2014-05-30   2014-05-28 

Y at-il qui peut me donner une idée ou d'écrire requête pour moi?

+0

Qu'avez-vous jusque là? Il y a un certain nombre de questions connexes ici ... –

Répondre

1

Si le prix de votre boisson peut changer à tout moment au cours d'un mois, vous pourriez en outre économiser le prix de chaque achat. J'ajouterais une colonne [PricePaid] à la table [DrinkHistory].

Lorsque vous ajoutez un enregistrement à [DrinkHistory], le prix de la boisson au moment est connu, mais plus tard il pourrait changer si vous enregistrez le prix actuel de l'histoire ...

Alors pour votre résultat vous pourrait simplement afficher le entier [DrinkHistory]

SELECT * FROM DrinkHistory; 
+0

toute autre solution si une entrée de date d'entrée en vigueur est mal faite ou si elle doit être éditée alors à ce moment-là il peut créer un problème –

0

Cela devrait fonctionner:

Select 
    DH.DrinkId, 
    DH.Qty, 
    DPE.DrinkPrice AS Price, 
    DH.DateTaken, 
    DPE.PriceEffectiveDate 
FROM DrinkHistory DH 
JOIN DrinkPricesEffect DPE ON DPE.PriceID = 
(
    Select Top 1 PriceID FROM 
    (
    Select PriceID,RANK() OVER(ORDER BY PriceEffectiveDate DESC) AS rnk 
    FROM DrinkPricesEffect 
    WHERE DH.DrinkId = DrinkId AND 
      DH.DateTaken >= PriceEffectiveDate 

)SubQ WHERE rnk = 1 
) 
WHERE DH.DateTaken Between '2014-05-01' AND '2014-05-30' 

ici vous pouvez trouver le lien SQL Fiddle: http://sqlfiddle.com/#!6/5f8fb/26/0

+0

Merci chère cela fonctionne bien –

+0

Veuillez marquer la réponse comme accepté –