2015-05-18 29 views
2

這是表'VendorItemPricing'。如何在SQL Server中一起使用PIVOT和JOIN?

ItemID VendorName  VendorPrice  
122  HP    215.13 
122  IBM   264.41 
122  Microsoft  257.65 

我用這個查詢來讓行成列。

Select ItemID, 
[HP] As HPPrice , 
[Apple] As ApplePrice, 
[Microsoft] As MicrosoftPrice, 
[IBM] As IBMPrice from (
select ItemID,VendorName,VendorPrice from VendorItemPricing where ItemID = 122)A 
PIVOT(MAX(VendorPrice) FOR VendorName IN ([HP],[Apple],Microsoft,IBM))P 

這就是我所期望的輸出。

ItemID HPPrice ApplePrice MicrosoftPrice IBMPrice 
122  215.13 NULL  257.65   264.41 

這是我的表'MasterItems',我用這個查詢得到下面的結果。

select ItemID, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice from MasterItems where ItemID = 122 

這可能是結果。

ItemID ItemPartNumber ItemDescription CreatedDate    InitialPrice 
122  AB246VB   Volt Fuser Kit 2015-05-15 17:17:32.940 215.14 

是否可以加入兩個結果並獲得如下結果?

ItemID ItemPartNumber ItemDescription CreatedDate    InitialPrice HPPrice ApplePrice MicrosoftPrice IBMPrice 
122  AB246VB   Volt Fuser Kit 2015-05-15 17:17:32.940 215.14   215.13  NULL   257.65   264.41 

回答

2

可以簡單地進行在PIVOT的源表的連接:

Select ItemID, ItemPartNumber, ItemDescription, CreatedDate, InitialPrice, 
     [HP] As HPPrice, 
     [Apple] As ApplePrice, 
     [Microsoft] As MicrosoftPrice, 
     [IBM] As IBMPrice 
from (
    select v.ItemID, VendorName, VendorPrice, 
      ItemPartNumber, ItemDescription, CreatedDate, InitialPrice 
    from VendorItemPricing as v 
    left join MasterItems as m on v.ItemID = m.ItemID 
    where v.ItemID = 122)A 
PIVOT(
    MAX(VendorPrice) 
    FOR VendorName IN ([HP],[Apple],Microsoft,IBM) 
)P 

SQL Fiddle Demo

2

如你所說主表使用CTE樞軸設置結果加入有樣本數據假設

declare @table table (Itemid Int,Vendorname varchar(10),VendorPrice DECIMAL(18,2)) 
insert into @table (Itemid,Vendorname,VendorPrice) 
values (122,'HP',125.66), 
(122,'microsoft',134.00), 
(122,'IBM',124.90) 

Declare @master table (Itemid int,Partnumber Varchar(10),Description varchar(20),Created datetime,InitialPrice decimal(18,2)) 
insert into @master (Itemid,Partnumber,Description,Created,InitialPrice)values (122,'AB246VB','Volt Fuser Kit',GETDATE(),215.14) 

;with cte as (
Select Itemid,[HP] As HPPrice , 
[Apple] As ApplePrice, 
[microsoft] As microsoftPrice, 
[IBM] As IBMPrice from (
select Itemid,Vendorname,VendorPrice from @table where ItemID = 122)A 
PIVOT(MAX(VendorPrice) FOR Vendorname IN ([HP],[Apple],[microsoft],[IBM]))P) 
select t.Itemid, 
t.Partnumber, 
t.Description, 
t.Created, 
t.InitialPrice, 
c.HPPrice,c.ApplePrice, 
c.IBMPrice, 
c.microsoftPrice from @master t,cte c where t.ItemID = 122 
2
SELECT M.*, [HP] As HPPrice, 
     [Apple] As ApplePrice, 
     [Microsoft] As MicrosoftPrice, 
     [IBM] As IBMPrice 
FROM MasterItems M 
JOIN (
    select ItemID,VendorName,VendorPrice from VendorItemPricing where ItemID = 122 
)A 
PIVOT(MAX(VendorPrice) FOR VendorName IN ([HP],[Apple],Microsoft,IBM)) P 
ON M.ItemId = P.ItemId 

根據您的要求,您可以將JOIN調整爲LEFT JOIN。