PIVOT操作(生成数据透视表)很有用,你可以聚合和旋转表中的数据以便增加数据的可读性。但是,有时候你不想在PIVOT表的同时进行聚合函数的操作。比如:你可以希望简单的旋转表1中的数据,来达到每一个team和其对应的members在一行中,就像表2中的所示的那样。
Table 1: Original Table
|
|
Table 2: PiVoted Table
|
|
但是一下是PIVOT操作的基本语法:
PIVOT (Aggregate function (column1) FOR column2 IN ( [val1],[val2],[val3] )) AS P where • column1 is the column you want to aggregate • column2 is the column you want to pivot • [val1],and [val3] are the headings for the piVoted columns • P is the alias for the results of the PIVOT expression
这个PIVOT表达式需要聚合函数。我设计了一个方法可以避免聚合操作。下图展示了这个方法的使用。
B标识的select语句很关键,这个语句中使用了ROW_NUMBER 函数,使用OVER子句按照teams类别来分开和排序结果。
Listing 1: Code That Pivots a Table Without Aggregating Data
|
|
B标识的select语句很关键,这个语句中使用了ROW_NUMBER 函数,使用OVER子句按照teams类别来分开和排序结果。
从下图可以看到,对应teams(CRM/ERP)的members显示了在其组中对应位置的数字。
Table 3: Result Set Produced by the SELECT Statement in Callout B
|
|
所以在C标识的语句中使用PIVOT (MAX(Member)来聚合Member列,使用FOR RowNum来pivot列名为RowNum的列。PIVOT 表达式的其他部分为IN ([1],[2],[3])) AS pvt
使用别名作为piVoted列的列名。实际的列名在A标注的select语句中。
在示例中,虽然你不能移除PIVOT语句中的聚合函数,但是你可以忽略它的影响。