首页 > 解决方案 > 为每位客户提供多项交易

问题描述

我有一个提供客户交易信息的查询。每个客户都有多个交易和这些交易的指定。查询输出 CustomerId、Amount、Date、Designation。每个客户都有多行。我想对此进行旋转,以便每个客户只有一行。

原始查询输出

预期产出

我知道这不是表示这些数据的理想方式,但出于这个特定用例的目的,它必须采用这种格式。列数将是(每个客户的最大交易数)X 3

标签: sqlsql-servertsqlpivot

解决方案


要遍历每个客户端的固定事务列表,您可以使用row_number()条件聚合:

select
    CustomerId,
    max(case when rn = 1 then Amount end) Amount1,
    max(case when rn = 1 then DateReceived end) DateReceived1,
    max(case when rn = 1 then Account end) Account1,
    max(case when rn = 2 then Amount end) Amount2,
    max(case when rn = 2 then DateReceived end) DateReceived2,
    max(case when rn = 2 then Account end) Account2,
    max(case when rn = 3 then Amount end) Amount3,
    max(case when rn = 3 then DateReceived end) DateReceived3,
    max(case when rn = 3 then Account end) Account3
from (
    select t.*, row_number() over(partition by CustomerId order by DateReceived) rn
    from mytable t
) t
group by CustomerId

每个客户端最多可以处理 3 个事务。更多信息,您可以使用更多表达式元组来扩展select子句。max(case when rn = ... then ... end)


推荐阅读