我希望改进我为使用 SQL-Server 2005 在 ASP.NET 4.0 中的小型 Web 应用程序编写的此查询。此应用程序将允许用户按产品 ID 搜索并让它返回以下信息:
- 最高购买价格 + 最近购买日期@此价格
- 最低购买价格 + 最近购买日期@此价格
- 最近购买价格 + 日期
- 平均购买价格(可选,我认为这可能会提高应用程序的实用性)
这是 Products 表的结构(我只包括相关列,这是一个已经在生产中的数据库,这些是非 pk 列)
- product_id (nvarchar(20))
- 价格(十进制(19,2))
- pDate(日期时间)
在我放下查询之前,我只想说我可以通过多个查询轻松获取这些信息,所以如果这是最佳实践,那么请忽略改进查询,但我的目标是尽量减少所需的查询数量获取所有需要的信息。
到目前为止我所拥有的:(注意:有价格 = 0 的行,所以我忽略了底部选择中寻找最低价格的行)
SELECT price, MAX(pDate)
FROM Products
WHERE product_id = @product_id AND
(price = (SELECT MAX(price)
FROM Products
WHERE product_id =@product_id) OR
price = (SELECT MIN(price)
FROM Products
WHERE product_id = @product_id AND price > 0))
GROUP BY price
现在这是返回 2 行:
- 第一个 = 最低价 + 日期
- 第二行 = 高价 + 日期
如果可能的话,我希望有一个查询返回 1 行,其中包含上述所有需要的信息,因为它可以简化在 ASP 中显示信息的过程。就像我之前说的,如果多个查询是 be 方法,那么不需要在这里重新编写一个复杂的查询。
编辑
这是一些示例数据
期望的查询结果:(忽略我在 excel 中输入的格式)
感谢 Ken Benson,这是我将使用的查询:
SELECT TOP 1 prod.product_id,
minp.price AS minprice, minp.pDate as minlastdate,
maxp.price AS maxprice, maxp.pDate as maxlastdate,
ag.price AS averageprice
FROM products AS prod
LEFT JOIN (SELECT lmd.product_id,max(lmd.pDate) as pDate,mn.price FROM products as lmd INNER JOIN
(SELECT product_id, min(price) AS price from products WHERE price > 0 group by product_id) as mn ON lmd.product_id=mn.product_id AND lmd.price=mn.price
group by lmd.product_id,mn.price ) AS minp ON minp.product_id=prod.product_id
LEFT JOIN (SELECT lxd.product_id,max(lxd.pDate) as pDate,mx.price FROM products as lxd INNER JOIN
(SELECT product_id, max(price) AS price from products group by product_id) as mx ON lxd.product_id=mx.product_id AND lxd.price=mx.price
group by lxd.product_id,mx.price ) AS maxp ON maxp.product_id=prod.product_id
LEFT JOIN (SELECT product_id,avg(price) as price FROM products WHERE price > 0 GROUP BY product_id) AS ag ON ag.product_id=prod.product_id
WHERE prod.product_id=@product_id