2011-01-12 59 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(列,值)。基本上,如果該列爲空,則返回值,否則返回列。 –

相關問題