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 如何将数据转置和分组到静态列中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
数据分析从入门到“入坑“系列利用Python学习数据分析-Numpy中的数组转置和轴对称