SQL 如何将数据转置和分组到静态列中? [复制]

Posted

技术标签:

【中文标题】SQL 如何将数据转置和分组到静态列中? [复制]【英文标题】:SQL How do I transpose and group data into static columns? [duplicate] 【发布时间】:2018-05-07 16:01:29 【问题描述】:

我有一个包含以下数据的表格:

UID  LAST    FIRST  FUND  AMOUNT  STATUS
1    Smith   John   C     100     1
1    Smith   John   B     250     1
1    Smith   John   E     150     1
2    Jones   Meg    B     275     1
2    Jones   Meg    F     150     1
3    Carter  Bill   A     100     1

我想将每个 UID 的 FUND、AMOUNT 和 STATUS 值转换为每个 UID 的单行。结果表将为 FUND_1、AMT_1、STATUS_1、FUND_2、AMT_2、STATUS_2、FUND_3、AMT_3、STATUS_3 添加列。每个 UID 可能有也可能没有总共 3 个资金。如果没有,剩余资金、金额和状态栏将留空。结果表将显示为:

UID  LAST   FIRST  FUND_1  AMT_1  STATUS_1  FUND_2  AMT_2  STATUS_2  FUND_3  AMT_3  STATUS_3
1    Smith  John   C       100    1         B       250    1         E       150    1
2    Jones  Meg    B       275    1         F       150    1
3    Carter Bill   A       100    1

为了澄清,这是数据如何从现有表移动到 UID 1 的结果表:

我似乎无法使用 PIVOT,因为 FUND_1、FUND_2、FUND_3 将是每个人的不同基金类别。问题TSQL Pivot without aggregate function 有帮助,但没有回答我的问题,因为我在该问题中的 DBColumnName 中有多行。

【问题讨论】:

相关:***.com/questions/1343145/… meta.***.com/questions/285551/… 你怎么知道给定人的资金顺序?每人的资金数量是动态的吗? @SeanLange - 资金的顺序无关紧要。它应该按照接收它们的顺序将它们添加到下一个可用的 FUND_#、AMT_# 和 STATUS_# 列中。每个人的资金数量是动态的,不会事先知道,但没有人超过3。 那么这很简单。您需要使用 PIVOT 或条件聚合(我的偏好)。您能否发布示例数据,以便我们可以使用它而不是图像? 【参考方案1】:

这是一种非常常见的条件聚合。请注意我如何将消耗性数据发布为表格和插入语句。老实说,做这部分比选择数据的实际代码花费的时间更长。你将来应该这样做。此外,您应该避免使用关键字作为列名。

declare @Something table
(
    UID int
    , LAST varchar(10)
    , FIRST varchar(10)
    , FUND char(1)
    , AMOUNT int
    , STATUS int
)

insert @Something values
(1, 'Smith', 'John', 'C', 100, 1)
, (1, 'Smith', 'John', 'B', 250, 1)
, (1, 'Smith', 'John', 'E', 150, 1)
, (2, 'Jones', 'Meg', 'B', 275, 1)
, (2, 'Jones', 'Meg', 'F', 150, 1)
, (3, 'Carter', 'Bill', 'A', 100, 1)
;

with SortedValues as
(
    select *
        , RowNum = ROW_NUMBER() over(partition by UID order by (select null))
    from @Something
)

select UID
    , Last
    , First
    , Fund_1 = max(case when RowNum = 1 then Fund end)
    , Amt_1 = max(case when RowNum = 1 then Amount end)
    , Status_1 = max(case when RowNum = 1 then Status end)

    , Fund_2 = max(case when RowNum = 2 then Fund end)
    , Amt_2 = max(case when RowNum = 2 then Amount end)
    , Status_2 = max(case when RowNum = 2 then Status end)

    , Fund_3 = max(case when RowNum = 3 then Fund end)
    , Amt_3 = max(case when RowNum = 3 then Amount end)
    , Status_3 = max(case when RowNum = 3 then Status end)
from SortedValues
group by UID
    , Last
    , First
order by UID
    , Last
    , First

【讨论】:

以上是关于SQL 如何将数据转置和分组到静态列中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

转置和聚合Oracle列数据

Spark:如何使用嵌套数组转置和分解列

SQL转置和添加列

数据分析从入门到“入坑“系列利用Python学习数据分析-Numpy中的数组转置和轴对称

在 MATLAB 中,为啥我不能组合转置和冒号运算符? [复制]

数据转置和连接,如何遵循内连接条件?