将多行合并为一列的 SQL Server 操作

3

我想把多行合并成一列。

我有一个表格:

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

感谢您的帮助。

你应该为你的表格提供更好的格式,这样它们才真正看起来像是表格。 - David East
是的,对不起,我刚刚修复了格式。 - user896917
我不确定从哪里开始让所有三个价格层显示在一行中。有什么想法吗? - user896917
我会查看pivot标签下的问题。那里有一些可以帮助你的。 - Jonathan Leffler
谢谢Jonathan,我觉得你刚刚帮我找到了答案。我现在要尝试一下,这是链接http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx - user896917
3个回答

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


谢谢,我的数据透视表没有你的那么简单。我也更喜欢条件聚合,再次感谢你的帮助。 - 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

很高兴听到这个消息。这些相关子查询是创建交叉表或数据透视表查询的更传统的方法之一。您可以随时将其标记为有用! - Tim Lehner

0

SQL Server 有透视表,Pinal Dave通常提供SQL Server相关内容的很好的介绍 - 至少它是一个起点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接