2011-01-12 26 views
3

我正在慢慢学习如何为我父母的业务创建产品和供应商数据库。我得到的是我们的产品参考索引的产品表格和2个不同供应商的更多表格,其中包含供应商产品参考和与我们的参考链接相关的价格。如何比较2个字段并返回每条记录的最低值?

我做了执行左外连接,使得它返回我们的产品的一个表,每个供应商的参考价,即查询:

参考|产品名称|供应商1参考| 供应商1价格|供应商2参考| 供应商2价格

这是我使用的查询:

SELECT Catalog.Ref, Catalog.[Product Name], Catalog.Price, 
    [D Products].[Supplier Ref], [D Products].Cost, 
    [GS Products].[Supplier Ref], [GS Products].Cost 

FROM ([Catalog] LEFT JOIN [D Products] ON Catalog.Ref = [D Products].Ref) 

LEFT JOIN [GS Products] ON Catalog.Ref = [GS Products].Ref; 

并非所有的产品都可以从两个供应商,因此,外连接。

我想要做的是采取通过上面的查询产生的表,只是展示产品的参考,最廉价的供应商的参考,最便宜的供应商的价格,即(含查询):

参考|最便宜的供应商参考| 最便宜的供应商价格

不幸的是我的SQL知识不太够好图了这一点,但如果有人能帮助我会很感激。

谢谢,罗布

+0

,你能否告诉我们,产生顶部结果查询 - 这样我们就可以适当地修改? –

+0

添加了查询 – BigRob

回答

4

请考虑一个单一的表来保存您的供应商的产品成本数据。有了这个样本PRODUCT_CATALOG数据:

product_id product_name price 
     1 foo    5 
     2 bar    10 
     3 baz    15 

供应商表可能是这样的:

supplier_id product_id cost 
D     1 2.5 
D     2 7.5 
GS     1 2.75 
GS     3 10 

然后一个GROUP BY查询,qryLowestPrice,会告诉你每个产品的最低成本:

SELECT s.product_id, Min(s.cost) AS MinOfcost 
FROM suppliers AS s 
GROUP BY s.product_id; 

然后,您可以在另一个查询中使用qryLowestPrice来提取所需的其他信息(product_name和supplier_id):

SELECT q.product_id, p.product_name, p.price, s.supplier_id, s.cost 
FROM 
    (qryLowestPrice AS q 
    INNER JOIN product_catalog AS p 
    ON q.product_id = p.product_id) 
    INNER JOIN suppliers AS s 
    ON (q.MinOfcost = s.cost) AND (q.product_id = s.product_id); 

这是基于从第二查询的输出上面的示例数据:

product_id product_name price supplier_id cost 
     1 foo    5 D   2.5 
     2 bar    10 D   7.5 
     3 baz    15 GS   10 
+0

这非常出色的队友非常感谢你,你已经救了我这么多头挠! – BigRob

0

我认为你会希望有相应的供应商编号最低价格。它可以用CASE WHEN结构来完成:

CASE WHEN expression THEN true_part ELSE false_part END 

这将是:

SELECT Ref, 
    CASE WHEN Supplier1Price < Supplier2Price THEN Supplier1Ref ELSE Supplier2Ref END AS "Cheapest Supplier Ref", 
    CASE WHEN Supplier1Price < Supplier2Price THEN Supplier1Price ELSE Supplier2Price END AS "Cheapest Supplier Price" 

当你使用Access,语法是有点不同。您可以使用功能IIF(condition, true_part, false_part)

SELECT Ref, 
    IIF(Supplier1Price < Supplier2Price, Supplier1Ref, Supplier2Ref) AS "Cheapest Supplier Ref", 
    IIF(Supplier1Price < Supplier2Price, Supplier1Price, Supplier2Price) AS "Cheapest Supplier Price" 
+0

感谢您的回复,你对我的理解对我有意义,但访问不喜欢我的语法: SELECT [Products Query]。[Ref], CASE WHEN [GS Products]。[ [供货商] END AS“最便宜的供应商参考”, MIN([GS产品]]。成本,[d产品]。成本)AS “最便宜的供应商价格” – BigRob

+0

在Access中,你必须使用'IIF'。我又 – Nekresh

+0

感谢更新我的效应初探与样本为您回应芽,但我仍然有一些麻烦访问,现在它返回“错误号码与查询表达式函数使用的参数” MIN([GS产品]。成本[d产品]。成本) – BigRob

1

试试这个

SELECT Catalog.Ref, 
     Catalog.[Product Name], 
     Catalog.Price, 
     [D Products].[Supplier Ref], 
     [D Products].Cost, 
     [GS Products].[Supplier Ref], 
     [GS Products].Cost, 
     iif ([D Products].Cost < [GS Products].Cost, [D Products].[Supplier Ref], [GS Products].[Supplier Ref]) AS CheapestSupplier, 
     iif ([D Products].Cost < [GS Products].Cost, [D Products].Cost, [GS Products].Cost) AS CheapestSupplierPrice 
FROM ( [Catalog] LEFT JOIN 
     [D Products] ON Catalog.Ref = [D Products].Ref) LEFT JOIN 
     [GS Products] ON Catalog.Ref = [GS Products].Ref; 
+0

这似乎很好用,谢谢John,但我注意到两个最便宜的列如果产品在[GS产品],存在返回值,例如,如果只在[d产品]表中提供的产品,它不会显示在最廉价的列东西,但它的工作,如果它只是在[GS产品]表中提供或两个表。有什么建议么? – BigRob

+0

我得到了它使用嵌套IIF的检查null每个字段然后运行的价格比较工作,感谢约翰 – BigRob

+0

我正要回答,MSSQL有一个名为ISNULL函数(列值),其中列是你的专栏,和值是你想要返回的值,如果它为null。在访问中,我认为它是nz(列,值)。基本上,如果该列为空,则返回值,否则返回列。 –

相关问题