Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql查询生效日期_Sql_Sql Server_Stored Procedures - Fatal编程技术网

sql查询生效日期

sql查询生效日期,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我想得到整个月购买饮料的报告,但饮料的价格可以在一个月内的任何时间变化,我想得到一个月价格变化的报告 我有两张桌子 SELECT [ID] ,[DrinkID] ,[UserID] ,[qty] ,[DateTaken] FROM [Snacks].[dbo].[DrinkHistory] SELECT [ID] ,[DrinkID] ,[UserID] ,[qty] ,[DateTaken

我想得到整个月购买饮料的报告,但饮料的价格可以在一个月内的任何时间变化,我想得到一个月价格变化的报告

我有两张桌子

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

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

[饮用价格效果]:

我希望得到2014年5月1日至2014年5月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  

有没有人能给我一些想法或给我写一些疑问?

如果你的饮料价格在一个月内随时可以改变,你可以为每次购买额外节省价格。我会在表[DrinkHistory]中添加一列[PricePaid]

在[DrinkHistory]中添加记录时,此时饮料的价格是已知的,但稍后可能会更改,因此您可以将当前价格保存到历史记录中

然后,对于您的结果,您可以只显示整个[DrinkHistory]

SELECT * FROM DrinkHistory;
这应该起作用:

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'

您可以在这里找到SQL Fiddle链接:

到目前为止您得到了什么?这里有许多相关的问题……如果某个时间生效日期输入错误或需要编辑,那么在那个时候可能会产生问题,还有其他解决方案吗
SELECT * FROM DrinkHistory;
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'