旋转

阅读(2) 标签: 旋转, 列转行, 行转列,

模式判定(最高优先级,必须先执行)

旋转有两种互斥模式:1. 行转列(默认模式)2. 列转行(逆向模式)

判定规则(必须严格执行)

如果自然语言包含:行转列 / 转为多列 / 生成新列 / 列作为标题 / 宽表

必须使用【行转列】,禁止使用逆向

如果自然语言包含:列转行 / 转为多行 / 展开为行 / 反透视 / 逆操作 / 长表

必须使用【逆向】

如果同时出现或语义冲突:

输出错误,不允许猜测

如果未明确出现关键词:

默认使用【行转列】,禁止添加逆向

快速判别

行转列(Pivot)

Ø  数据变

Ø  行减少,列增加

Ø  典型:两个列(标题列+取值列) → 变成多个列(原表的标题列的每个值变成一个新列的列名,原表的取值列的列值变成新列的值)

Ø  列转行(Unpivot)

Ø  数据变

Ø  列减少,行增加

Ø  典型:多个列变成两列(原表的多个列的标题变成一个新列标题列的值,原表的多个列的值变成一个新列取值列的值)

语法:

[分组 {[<分组列>] [命名 <新列名>]}] [标题列 <列名>] [取值列 <列名>] [计算方法] [表头 <自定义标题列名>]

参数:分组

本参数是个复合参数,由一组或多组子参数组成,每组子参数由分组列命名 <新列名>组成,表示一个分组列,多个分组列要用多组子参数表示。必要参数;类型是复合参数;参数名不能省略

参数:分组列

旋转时要固定不动的单个分组列。必要参数;类型是()标识;参数名必须省略。

参数:命名

参数分组列旋转后改的新列名。非必要参数,默认保持原列名不变;类型是()标识;参数名不能省略。注意,使用本参数时必须搭配参数分组列

例子:

分公司部门预算表的字段有BranchDeptStateAmount量。数据如下:

Branch  Dept  State  Amount

branch1  Administration  Florida 28000

branch1  Finance California  6000

branch2  Finance Florida 20000

branch2  Finance New York  11000

branch3  Finance Texas  11000

branch2  HR  Texas  10000

branch1  Marketing  California  31000

branch1  Marketing  New York  12000

branch2  Marketing  Pennsylvania  10000

branch3  Marketing  Texas  4000

branch1  Production  Florida 15000

branch3  Production  Pennsylvania  10000

branch3  R&D Pennsylvania  24000

branch2  R&D Texas  32000

branch1  Sales  California  28000

branch1  Sales  Florida 4000

branch2  Sales  New York  15000

branch3  Sales  Texas  12000

要求:保持BranchDept不变,将其他列/组内数据进行行转列,原State的值作为新列的标题,原Amount量的值作为新列的值,Branch改名为分公司。

期望结果:

分公司  Dept  Florida California  New York  Texas  Pennsylvania

branch1  Administration  28000 

branch1  Finance  6000 

branch1  Marketing  31000  12000 

branch1  Production  15000 

branch1  Sales  4000  28000   

branch2  Finance 20000  11000 

branch2  HR  10000 

branch2  Marketing  10000

branch2  R&D  32000 

branch2  Sales  15000 

branch3  Finance  11000 

branch3  Marketing  4000 

branch3  Production  10000

branch3  R&D  24000

branch3  Sales  12000 

NLC: 旋转 分组 Branch 命名 分公司, Dept; 标题列 State; 取值列 Amount

 

参数:标题列 <列名>

旋转后,原表中指定的单列的值将作为旋转后新列的标题,这个单列就是标题列。必要参数;类型是()标识;参数名不能省略。

例子:

比如,前面的部分NLC代码:标题列 State

参数:取值列 <列名>

旋转后,原表中指定的单列的值将作为旋转后新列的值,这个单列就是取值列。必要参数;类型是()标识;参数名不能省略。

例子:

上面NLC代码中的:取值列 Amount

参数:计算方法

6种区别较大的计算方法:首个、合计 平均 最大 最小、逆向。非必要参数,缺省参数值是首个;枚举类型;参数名必须省略。

合计 平均 最大 最小、首个:这是一组聚合算法,即行转列旋转后,标题列的一行对应取值列的多个值时,可以通过聚合算出单一值。这种情况一般是因为分组列、标题列、取值列之外还有原表没用到的列。

例子:

对前面的分公司部门预算表,按Branch分组,将组内记录行转列,State是标题列,Amount量是取值列,对Amount量取最大值。

期望结果:

Branch  Florida California  New York  Texas  Pennsylvania

branch1  28000  31000  12000 

branch2  20000  15000  32000  10000

branch3  12000  24000

NLC: 旋转 分组 Branch, Dept; 标题列 State; 取值列 Amount; 最大

解释:因为没用到Dept列,所以旋转后每个取值列对应多个Dept的值,可以通过聚合计算成一个值。

注意,枚举值首个也是聚合运算,表示从多个值中取第一个。

例子:

对前面的分公司部门预算表,按Branch分组,将组内记录行转列,State是标题列,Amount量是取值列,取首个值。

期望结果:

分公司  Florida California  New York  Texas  Pennsylvania

branch1  28000  6000  12000 

branch2  20000  11000  10000  10000

branch3  11000  10000

NLC: 旋转 分组 Branch, Dept; 标题列 State; 取值列 Amount

解释:首个是计算方法的默认参数值,上面代码省去了。

逆向:其他计算方法都是行转列这个大类下的聚合方法,本计算方法不是聚合方法,而是另一种操作模式(特殊的操作模式/模式切换),是列转行,是行转列的逆运算。具体来说,是保持分组列不变,把组内的数据/其他列做列转行,其中,原表其他列的标题变为新的标题列的值,原表其他列的列值变为新的取值列的值。

例子:

下面是宽预算表,其中分公司、Dept是分组列。

分公司  Dept  Florida California  New York  Texas  Pennsylvania

branch1  Administration  28000 

branch1  Finance  6000 

branch1  Marketing  31000  12000 

branch1  Production  15000 

branch1  Sales  4000  28000 

branch2  Finance 20000  11000 

branch2  HR  10000 

branch2  Marketing  10000

branch2  R&D  32000 

branch2  Sales  15000 

branch3  Finance  11000 

branch3  Marketing  4000 

branch3  Production  10000

branch3  R&D  24000

branch3  Sales  12000 

要求:保持分公司(改名为Branch)Dept不变,将其他列进行列转行,原其他列的标题转为新列State的值,原其他列的列值转为新列Amount量的值。

期望结果:

Branch  Dept  State  Amount

branch1  Administration  Florida 28000

branch1  Finance California  6000

branch2  Finance Florida 20000

branch2  Finance New York  11000

branch3  Finance Texas  11000

branch2  HR  Texas  10000

branch1  Marketing  California  31000

branch1  Marketing  New York  12000

branch2  Marketing  Pennsylvania  10000

branch3  Marketing  Texas  4000

branch1  Production  Florida 15000

branch3  Production  Pennsylvania  10000

branch3  R&D Pennsylvania  24000

branch2  R&D Texas  32000

branch1  Sales  California  28000

branch1  Sales  Florida 4000

branch2  Sales  New York  15000

branch3  Sales  Texas  12000

NLC: 旋转 分组 分公司 命名Branch, Dept; 标题列 State; 取值列 Amount; 逆向

参数:表头 <自定义标题列名>

旋转后,默认由参数标题列 <列名>指定新的标题名,如果不想用默认值,可以用本参数自定义新的标题名。非必要参数;标识集合;参数名不能省略。

例子:

对分公司部门预算表, BranchDept分组,将组内记录行转列,State是标题列,Amount量是取值列,新列使用标题FStateCstateNStateTStatePState

NLC: 旋转 分组 Branch, Dept; 标题列 State; 取值列 Amount; [FState,Cstate,NState,TState,PState]

结果:

Branch  Dept  FState  Cstate  NState  TState  PState

branch1  Administration  28000 

branch1  Finance  6000 

branch1  Marketing  31000  12000 

branch1  Production  15000 

branch1  Sales  4000  28000 

branch2  Finance 20000  11000 

branch2  HR  10000 

branch2  Marketing  10000

branch2  R&D  32000 

branch2  Sales  15000 

branch3  Finance  11000 

branch3  Marketing  4000 

branch3  Production  10000

branch3  R&D  24000

branch3  Sales  12000