2013-06-27 51 views
1

表格和列名称含糊不清,因为我在医疗保健行业,无法分享具体的细节。如果他们从我的公司购买产品(表1)而不是他们当前的供应商(表2),我将使用此查询来显示客户的节省量。SQL在限制数据的同时比较两个表格

我有2个表像这样的MSQL Server 2008上:

Table 1

ProductIDDescriptionVendorPrice


Table 2

ProductIDDescriptionPrice

我想选择Table 2每一行,并从Table 1匹配的数据。但我只想从Table 1中以最优惠的价格(供应商之间的最低价格)退还供应商,而不是每个供应商。因此对于Table 2中的任何ProductID,应该有来自Table1的一个匹配,或者如果Table 1中没有匹配的ProductID,则应该有NULL值。我加入了ProductID的表格,并返回了我想要的所有列,但是我无法将其限制为表1中的一个结果。如果我在Table 2中使用1000行来执行此操作,则应返回1000行。我保持与多个供应商比赛中的一些额外结束。

结果应该是这样的:

T1.ProductID, T1.Description, Vendor, T1.Price, T2.ProductID, 
T2.Description, T2.Price, (T2.Price - T1.Price) as 'Amount Saved' 

我写的SQL相当简单:

SELECT 
    T1.ProductID, 
    T1.Description, 
    Vendor, 
    T1.Price, 
    T2.ProductID, 
    T2.Description, 
    T2.Price, 
    (T2.Price - T1.Price) AS 'Amount Saved' 

FROM 
    Table2 T2 LEFT OUTER JOIN Table1 T1 
     ON T2.ProductID = T1.ProductID 
ORDER BY T2.ProductID 

这个答案从D士丹利工作;只需稍作更改即可选择价格最低的每一行。

SELECT 
    T1.ProductID, 
    T1.Description, 
    T1.Vendor, 
    T1.Price, 
    T2.ProductID, 
    T2.Description, 
    T2.Price, 
    (T1.Price - T2.Price) as 'Amount Saved' 
FROM Table2 T2 
LEFT JOIN (
    SELECT * FROM (
     SELECT ProductID, Description, Vendor, Price, 
     ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Price ASC) AS Row 
     FROM Table1) as result 
    WHERE row=1 
    ) AS T1 
    ON T2.ProductID = T1.ProductID 
+0

你可以发布查询吗? –

+1

什么是“最佳价格”是指最低(最低)价格,最高存款等?请粘贴您尝试过的代码 –

回答

1

您可以使用ROW_NUMBER找到从Table1“最佳”匹配行:

SELECT 
    T1.ProductID, 
    T1.Description, 
    T1.Vendor, 
    T1.Price, 
    T2.ProductID, 
    T2.Description, 
    T2.Price, 
    (T1.Price - T2.Price) as 'Amount Saved' 
    FROM Table2 T2 
    LEFT JOIN (
     SELECT ProductID, Description, Vendor, Price, 
      ROW_NUMBER() OVER (PARTITION BY ProductID ORDER BY Price DESC) Row 
      FROM Table1 
     ) T1 
     ON T2.ProductID = T1.ProductID 
0

目前尚不清楚,您的意思是“最佳价格”。如果它不是你想要的,只需将MAX()函数调整为MIN()函数。

SELECT T1.ProductID, T1.Description, Vendor, T1.Price, T2.ProductID, 
T2.Description, T2.Price, (T1.Price - T2.Price) as 'Amount Saved' 
FROM (
SELECT 
ProductID, Vendor, Description, Price 
FROM Table1 t 
WHERE Price = (SELECT MAX(Price) FROM Table1 subT WHERE t.ProductID = subT.ProductID) 
) T1 RIGHT JOIN 
Table2 T2 ON T1.ProductID = T2.ProductID 
  • Here的东西,你应该阅读。

编辑:我现在读,它是用于SQL Server。我提供的解决方案和SQL Server的其他阅读材料也适用。虽然它来自MySQL手册,但只涉及标准的SQL。

0

甚至认为有一些更好的预成型查询的可能性,如果你想包括与最小代价各种可能性,我喜欢这种方式,只需删除外部查询。

如果我对表格名称不正确,请告诉我这是我要求的 ,因为我不是100%确定您的意思是“最佳价格”,但我认为它是基于您选择的'已保存金额'字段。

SELECT 
    DISTINCT(T1.ProductId) AS ProductId, 
    Description, 
    Vendor, 
    Price, 
    SupplyDescription, 
    SupplyPrice, 
    AmountSaved AS 'Amount Saved' 
FROM 
(
    SELECT 
     T1.ProductId AS ProductId, 
     T1.Description, 
     T2.Vendor, 
     T1.Price, 
    /* T2.ProductId you are joining on this no need to include again*/ 
     T2.Description AS SupplyDescription, 
     T2.Price AS SupplyPrice , 
     (T1.Price - ISNULL(T2.Price,T1.Price)) as AmountSaved 
    FROM 
    Product T1 WITH(NOLOCK) 
    LEFT OUTER JOIN Supply T2 WITH(NOLOCK) 
     ON T1.ProductId = T2.ProductId 
    HAVING T2.Price = MIN(T2.Price) 
) tt 

注: 这是假设表产品和供应并不全天动态更新或更改极少,如果不是这种情况下(产品和供应表经常更新)和你不能证明通过避免锁定产生的脏读只是从查询中删除WITH(NOLOCK)提示