2011-11-05 50 views
0

我有一列根據結果具有不同的值。 我想返回固定列的一行。SQL Server:如何將列轉換爲一行?

列輸出如下:

Group | Item 
-------------- 
    G1 | 1 
    G1 | 2 
    G2 | 3 

我想輸出:

Group | Item1 | Item2 | Item3 
----------------------------- 
    G1 | 1 | 2 | N/A 
    G2 | 3 | N/A | N/A 

請幫助..提前

謝謝...

+2

怎麼辦數據庫表看起來如何? (模式) –

+0

你有最大數量的列嗎? –

+0

每個組可以有更少或3個項目。 – ANKIT

回答

3

因爲每一個組可以有三個項目最大的,我會用PIVOT operator

DECLARE @Test TABLE 
(
    RowID INT IDENTITY(1,1) PRIMARY KEY 
    ,[Group]VARCHAR(10) NOT NULL 
    ,Item INT NOT NULL 
    ,UNIQUE ([Group], Item) 
); 
INSERT @Test VALUES ('G1', 1); 
INSERT @Test VALUES ('G1', 2); 
INSERT @Test VALUES ('G2', 3); 

WITH PivotSource 
AS 
(
    SELECT t.[Group], t.Item 
      ,ROW_NUMBER() OVER(PARTITION BY t.[Group] ORDER BY t.RowID) RowNumber 
    FROM @Test t 

) 
SELECT pvt.[Group] 
     ,Item1 = ISNULL(CONVERT(VARCHAR(11), pvt.[1]) , 'N/A') 
     ,Item2 = ISNULL(CONVERT(VARCHAR(11), pvt.[2]) , 'N/A') 
     ,Item3 = ISNULL(CONVERT(VARCHAR(11), pvt.[3]) , 'N/A') 
FROM PivotSource src 
PIVOT (MAX(src.Item) FOR src.RowNumber IN ([1], [2], [3])) pvt; 

結果:

​​
+0

你好bogdan ..我認爲這將是一件容易的事,但它並不是那麼容易..實際上我有一個專欄,Item_Rate,現在我的桌子上會有7列,所以我該怎麼辦? – ANKIT

+0

您應該接受答案並轉發您的問題。 –

+0

@BogdanSahlean在我的測試中 - 你的代碼返回3行....不是2 –

0

由於你有固定數量的輸出列,你可以用ROW_NUMBER()和做一些技巧。

select child1.[Group], child1.Item as Item1, child2.Item as Item2, child3.Item as Item3 from 
(select [Group], Item from 
    (select [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child1_inner 
    where child1_inner.rownum = 1) as child1 
left outer join 
(select [Group], Item from 
    (select [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child2_inner 
    where child2_inner.rownum = 2) as child2 
on child1.[Group] = child2.[Group] 
left outer join 
(select [Group], Item from 
    (select [Group], Item, (ROW_NUMBER() over(partition by [group] order by item)) as rownum from GroupTable) as child3_inner 
    where child3_inner.rownum = 3) as child3 
on child1.[Group] = child3.[Group] 

這將返回null代替N/A,但您可以修復與COALESCE

+1

這個解決方案會產生很多邏輯讀取。 –

1

我想這樣的事情會工作:

SELECT t1.[Group], t1.Item, t2.Item, t3.Item 
from tbl t1, tbl t2, tbl t3 
where t1.[Group] = t2.[Group] and t1.[Group] = t3.[Group] 
    and t1.Item < t2.Item and t2.Item < t3.Item 
    and t1.[Group] in (select [Group] from tbl group by [Group] having COUNT(*) = 3) 
union 
SELECT t1.[Group], t1.Item, t2.Item, NULL 
from tbl t1, tbl t2 
where t1.[Group] = t2.[Group] 
    and t1.Item < t2.Item 
    and t1.[Group] in 
    (select [Group] from tbl group by [Group] having COUNT(*) = 2) 
union 
select tbl.[Group], tbl.Item, NULL, NULL 
from tbl 
where [Group] in (select [Group] from tbl group by [Group] having COUNT(*) = 1) 
+0

該解決方案將生成大量邏輯讀取。 –

+0

你說得對。我的解決方案不是非常優雅的性能(它使用了很多笛卡爾產品和子查詢)。 – MNos