2012-05-21 192 views
3

我想將多行合併到一列中。 我有一個表:SQL Server將多行合併到一列

COST_ID PRICE_ID PRICE_TIER COST 
1  4   1  850.00 
2  4   2  950.00 
3  4   3  1000.00 
4  7   1  250.00 
5  7   2  275.00 
6  7   3  300.00 

我想輸出,每一列都price_id,它應該是這個樣子:

ID PriceID C1ID C1Cost C2ID C2Cost C3ID C3Cost 
1 4  1 850.00 2 950.00 3 1000.00 
2 7  4 250.00 5 275.00 6 300.00 

謝謝您的幫助。

+0

你應該爲你的表提供更好的格式,所以他們實際上像表。 –

+0

是的,對不起,我只是固定格式。 – user896917

+0

我只是不知道從哪裏開始讓所有三個價格層級都顯示在一行中。有任何想法嗎? – user896917

回答

2

我首選的方案是使用條件骨料像這樣:

SELECT ROW_NUMBER() OVER(ORDER BY Price_ID) [ID], 
     Price_ID, 
     MIN(CASE WHEN Price_Tier = 1 THEN Cost_ID END) [C1ID], 
     MIN(CASE WHEN Price_Tier = 1 THEN Cost END) [C1Cost], 
     MIN(CASE WHEN Price_Tier = 2 THEN Cost_ID END) [C2ID], 
     MIN(CASE WHEN Price_Tier = 2 THEN Cost END) [C2Cost], 
     MIN(CASE WHEN Price_Tier = 3 THEN Cost_ID END) [C3ID], 
     MIN(CASE WHEN Price_Tier = 3 THEN Cost END) [C3Cost] 
FROM T 
GROUP BY Price_ID 

但是這也用SQL-Server的PIVOT函數完成。但是它需要一個UNION,因爲PIVOT不允許在一個PIVOT中使用多個聚合。

SELECT ROW_NUMBER() OVER(ORDER BY Price_ID) [ID], 
     * 
FROM ( SELECT Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'Cost' [Price_Tier], MIN(Cost) [Value] 
      FROM T 
      GROUP BY Price_ID, Price_Tier 
      UNION ALL 
      SELECT Price_ID, 'C' + CONVERT(VARCHAR, Price_Tier) + 'ID' [Price_Tier], MIN(Cost_ID) [Value] 
      FROM T 
      GROUP BY Price_ID, Price_Tier 
     ) data 
     PIVOT 
     ( MAX(Value) 
      FOR Price_Tier IN ([C1ID], [C1Cost], [C2ID], [C2Cost], [C3ID], [C3Cost]) 
     ) Pvt 

Demonstrative SQL Fiddle

+0

謝謝你,我的支點不像你的那麼簡單。我還喜歡條件彙總,再次感謝您的幫助。 – user896917

0

SQL Server具有數據透視表,Pinal Dave通常提供了一個很好的介紹SQL Server的東西 - 這是一個至少開始的地方。

+0

謝謝,我也會研究它。 – user896917

0

如果PRICE_ID和PRICE_TIER形成了獨特的鍵,你可以做這樣的事情:

select 
     row_number() over (order by PRICE_ID) as ID 
    , PRICE_ID as PriceID 
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 1) as C1ID 
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 1) as C1Cost 
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 2) as C2ID 
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 2) as C2Cost 
    , (select COST_ID from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 3) as C3ID 
    , (select COST from cte where PRICE_ID = t.PRICE_ID and PRICE_TIER = 3) as C3Cost 
from MY_TABLE t 
group by PRICE_ID 
order by PRICE_ID 
+0

謝謝,這也很好! – user896917

+0

很高興聽到。這些相關的子查詢是創建交叉表或數據透視查詢的更傳統手段之一。您始終可以將其標記爲有用! –