汇总 sql 中列值的日期
Rolling up on a date for a column value in sql
我有一个 table 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日无价等
我还有一个tableFRUIT_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_COST
(即 Price * 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'
这显然会忽略 Price
在给定的 Date
上不可用的水果。
我如何修改上述查询中两个 table 之间的内部连接,这样如果对于 Date
Price
对于 Fruit
不可用,那么应该检查之前的 Date
并在可用的情况下采用 Price
。如果 Price
在前一个 Date
上不可用,则应检查前一个 Date
之前的 Date
,如果可用,则采用 Price
。
我想从给定 Date
开始的 30 天内继续检查价格。只有当 Price
在过去 30 Dates
.
中不可用时,才应忽略 Fruit
我修改了上面的查询如下,但后来卡住了:
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 天直到找到 Price
的第一个可用价格?
感谢阅读!
在日期范围内查找所需行的子查询:
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 )
我有一个 table 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日无价等
我还有一个tableFRUIT_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_COST
(即 Price * 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'
这显然会忽略 Price
在给定的 Date
上不可用的水果。
我如何修改上述查询中两个 table 之间的内部连接,这样如果对于 Date
Price
对于 Fruit
不可用,那么应该检查之前的 Date
并在可用的情况下采用 Price
。如果 Price
在前一个 Date
上不可用,则应检查前一个 Date
之前的 Date
,如果可用,则采用 Price
。
我想从给定 Date
开始的 30 天内继续检查价格。只有当 Price
在过去 30 Dates
.
Fruit
我修改了上面的查询如下,但后来卡住了:
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 天直到找到 Price
的第一个可用价格?
感谢阅读!
在日期范围内查找所需行的子查询:
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 )