在不使用PIVOT或Cased Aggregate Functions的情况下将行转换为列

时间:2016-05-09 12:25:12

标签: sql sql-server sql-server-2012

我的数据库中有一个名为customers的表,其中有零售商(客户) 和typeid分开的分销商(例如:typeid = 1客户和typeid = 2分销商)

现在有一个映射表,其中有客户和分销商的映射。 请注意,零售商或客户最多只有两个分销商。

下面是Mapping表。

| Customer    | Distributor  |
    ----------------------------
    |   Customer1 | Distributor1 | 
    |   Customer1 | Distributor2 |  
    |   Customer2 | Distributor1 |  
    |   Customer2 | Distributor3 |  
    |   Customer3 | Distributor2 |

我想将此表格表示如下

| Customer    | Partner1     | Partner 2     |
---------------------------------------------------
| Customer1   | Distributor1 | Distributor2  |
| Customer2   | Distributor1 | Distributor3  |
| Customer3   | Distributor2 | Null          |

Pivot的概念让我印象深刻,但是没有列可以对要应用的数据枢轴执行聚合函数。

获得理想结果的简单方法是什么?

PS:我已经想过从两个临时表中获取两个不同的集合然后加入它们,但这看起来很乏味。如果有人可以通过更简单的解决方案指出我的结果,请帮助我。

1 个答案:

答案 0 :(得分:2)

您可以使用row_number()

生成旋转列的需要
select customer,
       max(case when seqnum = 1 then distributor end) as distributor1,
       max(case when seqnum = 2 then distributor end) as distributor2
from (select t.*,
             row_number() over (partition by customer order by (select null)) as seqnum
      from t
     ) t
group by customer;