SQL如何将数据转换和分组到静态列中?
我有一个包含以下数据的表格:SQL如何将数据转换和分组到静态列中?,sql,sql-server,Sql,Sql Server,我有一个包含以下数据的表格: 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 B
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的资金、金额和状态值转换为每个UID的一行。生成的表将添加以下列:基金1、金额1、状态1、基金2、金额2、状态2、基金3、金额3、状态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,因为基金1、基金2、基金3将为每个人提供不同的基金类别。这个问题有助于回答我的问题,但没有回答我的问题,因为我在该问题的DBColumnName中有多行 这是一种非常常见的条件聚合。注意我是如何将可消费数据作为表和insert语句发布的。老实说,选择数据所用的时间比实际代码要长。你以后应该这样做。此外,还应避免使用关键字作为列名
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
相关:你如何知道一个人的资金顺序?每个人的基金数量是动态的吗?@SeanLange-基金的顺序并不重要。它应该按照收到它们的顺序接收它们,并将它们添加到下一个可用的基金、金额和状态列中。每个人的基金数量是动态的,事先不会知道,但没有人拥有超过3个。这很简单。您需要使用透视或条件聚合(我的首选)。你能发布样本数据,这样我们就可以使用它而不是作为图像吗?