【发布时间】:2009-02-18 07:50:48
【问题描述】:
我正在尝试生成一份销售报告,其中列出了每个产品 + 给定月份的总销售额。这有点棘手,因为产品的价格可能会在整个月内发生变化。例如:
- 在 1 月 1 日和 1 月 15 日之间,我的公司以每个 10 美元的价格销售了 50 个小部件
- 在 1 月 15 日和 1 月 31 日之间,我的公司以每个 15 美元的价格销售了 50 多个小部件
- 1 月份小部件的总销售额 = (50 * 10) + (50 * 15) = $1250
此设置在数据库中表示如下:
销售表 Sale_ID 产品ID Sale_Date 1 1 2009-01-01 2 1 2009-01-01 3 1 2009-01-02 ... 50 1 2009-01-15 51 1 2009-01-16 52 1 2009-01-17 ... 100 1 2009-01-31 价格表 产品_ID销售_日期价格 1 2009-01-01 10.00 1 2009-01-16 15.00在价格表中定义价格后,它将应用于从给定的 SaleDate 开始以给定 ProductID 售出的所有产品。
基本上,我正在寻找一个返回数据如下的查询:
期望的输出 Sale_ID ProductID Sale_Date 价格 1 1 2009-01-01 10.00 2 1 2009-01-01 10.00 3 1 2009-01-02 10.00 ... 50 1 2009-01-15 10.00 51 1 2009-01-16 15.00 52 1 2009-01-17 15.00 ... 100 1 2009-01-31 15.00我有以下疑问:
SELECT
Sale_ID,
Product_ID,
Sale_Date,
(
SELECT TOP 1 Price
FROM Prices
WHERE
Prices.Product_ID = Sales.Product_ID
AND Prices.Sale_Date < Sales.Sale_Date
ORDER BY Prices.Sale_Date DESC
) as Price
FROM Sales
这可行,但有没有比嵌套子选择更有效的查询?
在您指出在销售表中包含“价格”会更容易之前,我应该提一下,该架构由另一个供应商维护,我无法更改它。万一这很重要,我使用的是 SQL Server 2000。
【问题讨论】:
-
您在子选择中缺少 Product_ID 匹配,不是吗?还是我只是不明白你的问题?
-
你是对的,对此感到抱歉:)
标签: sql sql-server optimization