【问题标题】:SQL Server merge multiple rows into one columnSQL Server 将多行合并为一列
【发布时间】:2012-05-27 23:49:29
【问题描述】:

我正在尝试将多行合并为一列。 我有一张桌子:

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

感谢您的帮助。

【问题讨论】:

  • 你应该为你的表格提供更好的格式,让它们看起来像表格。
  • 是的,很抱歉我刚刚修复了格式。
  • 我只是不确定从哪里开始让所有三个价格等级都显示在一行中。有什么想法吗?
  • 我会查看pivot 标签下的问题。有些应该可以帮助你。
  • 谢谢乔纳森,我想你只是帮我弄清楚了。我现在要试试,这是链接blogs.msdn.com/b/spike/archive/2009/03/03/…

标签: sql-server merge pivot


【解决方案1】:

我首选的解决方案是使用这样的条件聚合:

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

【讨论】:

  • 谢谢,我的支点没有你的那么简单。我也更喜欢条件聚合,再次感谢您的帮助。
【解决方案2】:

如果 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

【讨论】:

  • 很高兴听到。这些相关子查询是创建交叉表或数据透视查询的更传统方法之一。您可以随时将此标记为有帮助!
【解决方案3】:

SQL Server 有 Pivot Tables,Pinal Dave 通常很好地介绍了 SQL Server 的东西 - 至少它是一个开始的地方。

【讨论】:

  • 谢谢,我也去看看。
猜你喜欢
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-09
  • 2017-08-23
  • 2018-04-22
  • 2016-12-29
相关资源
最近更新 更多