2014-09-04 87 views
0

我在SQL Server中有一个如下所示的表。所有nvarchar数据类型。根据列中的值将SQL表拆分为多个表

ID  Price  Supplier 
515  1   A 
516  2   A 
517  3   A 
515  1.1   B 
516  1.9   B 

和我想把一个SQL /存储过程,其通过由供应商数据的侧比较结果在侧。所以按供应商分类并按ID进行比较。

ID  Price  Supplier ID2 price2 Supplier2 
515  1   A  515 1.1 B 
516  2   A  516 1.9 B 
517  3   A 

表中的供应商数量始终是2 供应商名称可以改变的数据来表是动态的。 可能是供应商2数据完全丢失的情况。

如何为此添加一个sql?

+1

对于SQL Server使用PIVOT – Donal 2014-09-04 19:27:32

+0

一个ID有多少个供应商? – wdosanjos 2014-09-04 19:38:28

回答

2

你可以使用自联接:

SELECT a.* 
     ,b.ID ID2 
     ,b.Price Price2 
     ,b.Supplier Supplier2 
FROM Table1 a 
LEFT JOIN Table1 b 
    ON a.ID = b.ID 
    AND a.Supplier <> b.Supplier 
WHERE a.Supplier = 'a' 

演示:SQL Fiddle

这假定供应商A总是存在的,如果不是,你可以使用一个FULL JOINCOALESCE(a.ID,b.ID)的情况。

更新:由于A是一个样本值和实际值可以改变,创造了ROW_NUMBER()将允许您使用自连接方法:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Supplier) RN 
       FROM Table1) 
SELECT a.ID 
     ,a.Price 
     ,a.Supplier 
     ,b.ID ID2 
     ,b.Price Price2 
     ,b.Supplier Supplier2 
FROM cte a 
LEFT JOIN cte b 
    ON a.ID = b.ID 
    AND a.Supplier <> b.Supplier 
WHERE a.RN = 1 

演示:SQL Fiddle

+0

不一定供应商'a'将永远在那里。 A和B只是作为例子。来到桌上的数据是动态的。 – Cannon 2014-09-04 19:35:41

+0

@buffer_overflow值的数量也是动态的,还是只有2? – 2014-09-04 19:39:09

+0

表中总会有两个供应商。 – Cannon 2014-09-04 19:40:33

相关问题