在sql中列出一个列值的日期

时间:2015-06-04 19:15:50

标签: sql db2

我有一张表FRUIT_PRICE,每天保持水果价格。

Date          |    Fruit         |    Price
-----------------------------------------------------
2015-06-04         Banana             10
2015-06-04         Apple              20
2015-06-04         Orange             15 
2015-06-03         Orange             18
2015-06-03         Banana             9
2015-06-02         Banana             11
2015-06-02         Orange             16
2015-06-02         Apple              22
2015-06-02         Papaya             40
-----------------------------------------------------

完全有可能某些水果的价格没有填充。对于例如6月3日和4日没有木瓜价格,6月3日没有苹果价格等等。

我有另一张表FRUIT_QTY,每天保存水果的数量。

Date          |    Fruit         |    QTY
-----------------------------------------------------
2015-06-04         Banana             100
2015-06-04         Apple              50
2015-06-04         Orange             150 
2015-06-04         Papaya             200 
2015-06-03         Orange             50
2015-06-03         Banana             100
2015-06-03         Apple              150
2015-06-03         Papaya             100 
2015-06-02         Banana             200
2015-06-02         Orange             150
2015-06-02         Apple              50
2015-06-02         Papaya             200
-----------------------------------------------------

我想在某一天计算TOTAL_COSTPrice * Qty)。

我在下面写了相同的查询:

SELECT 
   A.DATE, A.FRUIT, (B.PRICE*A.QTY) AS TOTAL_COST 
FROM 
   FRUIT_QTY A INNER JOIN FRUIT_PRICE B ON A.FRUIT = B.FRUIT AND A.DATE = B.DATE 
  WHERE
     A.DATE = '2015-06-04' 

这显然会忽略给定PriceDate不可用的结果。

如何在上述查询中修改两个表之间的内部联接,以便如果Date的{​​{1}} Price不可用,那么之前的Fruit应该检查并Date如果可用的话。如果Price上的Price不可用,则应检查上一个Date之前的Date,如果可用则Date

我想继续检查给定Price的30天的价格。仅当Date在过去30 Fruit内不可用时,才应忽略Price

我修改了上面的查询,但是后来卡住了:

Dates

上面的子查询如何从给定日期开始获取SELECT A.DATE, A.FRUIT, (B.PRICE*A.QTY) AS TOTAL_COST FROM FRUIT_QTY A INNER JOIN (sub query here to get first available price in last 30 days starting from given date in where condition) as B ON A.FRUIT = B.FRUIT WHERE A.DATE = '2015-06-04' 的第一个可用价格,并在找到Fruit之前滚动最多30天?

感谢阅读!

1 个答案:

答案 0 :(得分:0)

子查询在日期范围内找到所需的行:

B.Date = 
   ( SELECT MAX(C.Date)
     FROM FRUIT_PRICE AS C
     WHERE C.Date BETWEEN A.Date - 30 DAY AND A.Date
     AND A.Fruit = C.Fruit  )