2012-05-21 156 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

很高兴听到。这些相关的子查询是创建交叉表或数据透视查询的更传统手段之一。您始终可以将其标记为有用! –