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个。这很简单。您需要使用透视或条件聚合(我的首选)。你能发布样本数据,这样我们就可以使用它而不是作为图像吗?