使用 PIVOT 将行转换为列

Posted

技术标签:

【中文标题】使用 PIVOT 将行转换为列【英文标题】:Convert rows to columns using PIVOT 【发布时间】:2020-06-17 06:00:29 【问题描述】:

我在 SQL Server 中有一个名为 AmountList 的表:

其中主键是“UniqueCol1, UniqueCol2, AmountID”

并根据 AmountID 我想将结果转为:

我在使用 Pivot 时面临挑战,因为只能使用聚合函数,但我需要字段的实际值。

更新:添加了我对使用 JOINS 的解决方案的尝试,但需要一些性能更高的查询。

【问题讨论】:

PIVOT 没有成功,因此使用了多个 FULL OUTER JOINS 来实现结果。但是使用连接有点慢,因此使用 PIVOT 寻找解决方案 我们仍然希望看到您的尝试。 附上我的尝试以供参考。 【参考方案1】:

您可以使用case 表达式来实现您的预​​期输出。

select
  uniqueCol1,
  uniqueCol2,
  sum(case when AmountID = 1 then amount end) as Amount1MO,
  sum(case when AmountID = 3 then amount end) as Amount3MO,
  sum(case when AmountID = 6 then amount end) as Amount6MO,
  sum(case when AmountID = 9 then amount end) as Amount9MO,
  sum(case when AmountID = 12 then amount end) as Amount12MO
from AmountList
group by
  uniqueCol1,
  uniqueCol2

【讨论】:

感谢@zealous 提供的解决方案,它有效,但我们也可以使用pivot 吗? 是的,你可以试试,这里有很好的例子sqlservertutorial.net/sql-server-basics/sql-server-pivot。如果我的回答解决了您的问题,请点击勾选标记接受。谢谢 是的,但是请您指导我,在数据仓库、使用 CASE 或使用 PIVOT 的查询方面性能更高?? @TusharRastogi 这是你的答案***.com/questions/26936804/… 这很有帮助,谢谢:)【参考方案2】:
select 
CASE WHEN t1.uniqueCol1 is not null THEN t1.uniqueCol1
WHEN t2.uniqueCol1 is not null THEN t2.uniqueCol1
t3.uniqueCol1 is not null THEN t3.uniqueCol1
t4.uniqueCol1 is not null THEN t4.uniqueCol1
t5.uniqueCol1 is not null THEN t5.uniqueCol1
ELSE NULL END AS uniqueCol1,
CASE WHEN t1.uniqueCol2 is not null THEN t1.uniqueCol2
WHEN t2.uniqueCol2 is not null THEN t2.uniqueCol2
t3.uniqueCol2 is not null THEN t3.uniqueCol2
t4.uniqueCol2 is not null THEN t4.uniqueCol2
t5.uniqueCol2 is not null THEN t5.uniqueCol2
ELSE NULL END AS uniqueCol2,
Amount1MO,Amount3MO,Amount6MO,Amount9MO,Amount12MO from

    (
    select
      uniqueCol1,
      uniqueCol2,
      Amount as Amount1MO,
    from AmountList
    where AmountID = 1
    )t1

        FULL OUTER JOIN

    (
    select
      uniqueCol1,
      uniqueCol2,
      Amount as Amount3MO,
    from AmountList
    where AmountID = 3
    )t2

        ON t1.uniqueCol1=t2.uniqueCol1 AND t1.uniqueCol2 = t2.uniqueCol2
        FULL OUTER JOIN

    (
    select 
      uniqueCol1,
      uniqueCol2,
      Amount as Amount6MO,
    from AmountList
    where AmountID = 6
    )t3

        ON t2.uniqueCol1=t3.uniqueCol1 AND t2.uniqueCol2 = t3.uniqueCol2
        FULL OUTER JOIN

    (
    select
      uniqueCol1,
      uniqueCol2,
      Amount as Amount9MO,
    from AmountList
    where AmountID = 9
    )t4

        ON t3.uniqueCol1=t4.uniqueCol1 AND t3.uniqueCol2 = t4.uniqueCol2
        FULL OUTER JOIN

    (
    select
      uniqueCol1,
      uniqueCol2,
      Amount as Amount12MO,
    from AmountList
    where AmountID = 12
    )t5

【讨论】:

以上是关于使用 PIVOT 将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

在 SQL 中使用“Pivot”将行转换为列

使用 pivot 和 in 子句将行转换为列

Oracle SQL Developer:如何使用 PIVOT 函数将行转置为列

SQL Server - Pivot 将行转换为列(带有额外的行数据)

带有条件的 Oracle SQL Pivot 将行转换为列

BigQuery 标准 SQL 如何将行转换为列