2012-11-08 61 views
2

我正在使用SQL Server 2012,我需要獲取以下輸出的幫助。我的表結構如下:在編寫數據透視查詢時需要幫助以從不同的select語句中選擇列

declare @TestTable table (MaterialCode char(5), ItemCode char(5), ItemName varchar(50)) 

insert into @TestTable values ('AA-01', 'A0001', 'iPhone') 
insert into @TestTable values ('AA-02', 'A0001', 'iPad') 
insert into @TestTable values ('AA-03', 'A0001', 'iPod') 

insert into @TestTable values ('AA-01', 'B0001', 'Galaxy Tab') 
insert into @TestTable values ('AA-02', 'B0001', 'Galaxy Note') 

insert into @TestTable values ('AA-01', 'C0001', 'Nokia Lumnia') 
insert into @TestTable values ('AA-02', 'C0001', 'Motorola') 
insert into @TestTable values ('AA-03', 'C0001', 'Samsung S3') 
insert into @TestTable values ('AA-04', 'C0001', 'Sony') 

--select * from @TestTable 

select MaterialCode, ItemCode as [A_ItemCode], ItemName as [A_ItemName] 
from @TestTable where ItemCode='A0001' 

select MaterialCode, ItemCode as [B_ItemCode], ItemName as [B_ItemName] 
from @TestTable where ItemCode='B0001' 

select MaterialCode, ItemCode as [C_ItemCode], ItemName as [C_ItemName] 
from @TestTable where ItemCode='C0001' 

和輸出,我需要應該從以上三個select語句,這應該是如下產生的:

enter image description here

正如你可以看到,當有沒有記錄,那裏顯示NULL。任何人都可以幫助我獲得這個輸出。 TIA。

編輯

@JohnLBevan,我想你的轉動方式,當我有另一個紀錄是具有ItemCode = D0001

insert into @TestTable values ('AA-05', 'D0001', 'Test1') 

現在連這個紀錄被顯示爲

AA-05 NULL NULL NULL NULL NULL NULL 

如何避免這些類型的記錄。

回答

3

不使用樞軸,但是這給你所期望的結果:

SELECT coalesce(a.MaterialCode, b.MaterialCode, c.MaterialCode) MaterialCode 
, a.ItemCode A_ItemCode 
, a.ItemName A_ItemName 
, b.ItemCode B_ItemCode 
, b.ItemName B_ItemName 
, c.ItemCode C_ItemCode 
, c.ItemName C_ItemName 
FROM (select * from @TestTable where ItemCode='A0001') a 
full outer join (select * from @TestTable where ItemCode='B0001') b 
    on a.MaterialCode = b.MaterialCode 
full outer join (select * from @TestTable where ItemCode='C0001') c 
    on a.MaterialCode = c.MaterialCode 
    or b.MaterialCode = c.MaterialCode 

這裏是它採用了旋轉備用,雖然這種感覺混亂:

SELECT MaterialCode 
, case when [A0001] is null then null else 'A0001' end A_ItemCode 
, [A0001] A_ItemName 
, case when [A0001] is null then null else 'B0001' end B_ItemCode 
, [B0001] B_ItemName 
, case when [A0001] is null then null else 'C0001' end C_ItemCode 
, [C0001] C_ItemName 
FROM @TestTable a 
pivot (
    max(ItemName) 
    for ItemCode in ([A0001],[B0001],[C0001]) 
) pvt 

編輯

如果你想要更靈活一點,下面是一個動態版本:

declare @dynamicSql nvarchar(max) 
, @dynamicSqlPart nvarchar(max) 

select * into #TestTable from @TestTable 

set @dynamicSql = 'SELECT MaterialCode ' + CHAR(10) 
select @dynamicSql = @dynamicSql + ', case when [' + ItemCode + '] is null then null else ''' + ItemCode + ''' end ' + ItemCode + '_ItemCode ' + CHAR(10) 
    + ', ' + QUOTENAME(ItemCode) + ' ' + ItemCode + '_ItemName ' + CHAR(10) 
, @dynamicSqlPart = ISNULL(@dynamicSqlPart + ',','') + QUOTENAME(ItemCode) 
from (select distinct ItemCode from @TestTable) x 

set @dynamicSql = @dynamicSql + 'from #TestTable a' + CHAR(10) 
    + 'pivot (' + CHAR(10) 
    + ' max(ItemName) ' + CHAR(10) 
    + ' for ItemCode in (' + @dynamicSqlPart + ')' + CHAR(10) 
    + ') pvt' + CHAR(10) 

print isnull(@dynamicSql,'?') 
exec (@dynamicSql) 

drop table #TestTable 
+1

+1這裏是一個現場演示:[** Live Demo **](http://data.stackexchange.com/stackoverflow/query/edit/84455) –

+0

哦;我不知道堆棧交換有這個功能;不錯。謝謝@MahmoudGamal。 – JohnLBevan

+1

您也可以查詢stackoverflow.com和其他stackexchange站點的所有數據。但還有另一個網站比sql演示更好:[** SQL Fiddle **](http://www.sqlfiddle.com/)。 –