模式判定(最高优先级,必须先执行)
旋转有两种互斥模式:1. 行转列(默认模式)2. 列转行(逆向模式)
判定规则(必须严格执行):
如果自然语言包含:“行转列 / 转为多列 / 生成新列 / 列作为标题 / 宽表”
→ 必须使用【行转列】,禁止使用“逆向”
如果自然语言包含:“列转行 / 转为多行 / 展开为行 / 反透视 / 逆操作 / 长表”
→ 必须使用【逆向】
如果同时出现或语义冲突:
→ 输出错误,不允许猜测
如果未明确出现关键词:
→ 默认使用【行转列】,禁止添加“逆向”
快速判别
行转列(Pivot):
Ø 数据变“宽”
Ø 行减少,列增加
Ø 典型:两个列(标题列+取值列) → 变成多个列(原表的标题列的每个值变成一个新列的列名,原表的取值列的列值变成新列的值)
Ø 列转行(Unpivot):
Ø 数据变“长”
Ø 列减少,行增加
Ø 典型:多个列 → 变成两列(原表的多个列的标题变成一个新列标题列的值,原表的多个列的值变成一个新列取值列的值)
语法:
[分组 {[<分组列>] [命名 <新列名>]}] [标题列 <列名>] [取值列 <列名>] [计算方法] [表头 <自定义标题列名>]
参数:分组
本参数是个复合参数,由一组或多组子参数组成,每组子参数由分组列、命名 <新列名>组成,表示一个分组列,多个分组列要用多组子参数表示。必要参数;类型是复合参数;参数名不能省略
参数:分组列
旋转时要固定不动的单个分组列。必要参数;类型是(列)标识;参数名必须省略。
参数:命名
参数分组列旋转后改的新列名。非必要参数,默认保持原列名不变;类型是(列)标识;参数名不能省略。注意,使用本参数时必须搭配参数分组列。
例子:
分公司部门预算表的字段有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
要求:保持Branch、Dept不变,将其他列/组内数据进行行转列,原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量; 逆向
参数:表头 <自定义标题列名>
旋转后,默认由参数标题列 <列名>指定新的标题名,如果不想用默认值,可以用本参数自定义新的标题名。非必要参数;标识集合;参数名不能省略。
例子:
对分公司部门预算表, 按Branch、Dept分组,将组内记录行转列,State是标题列,Amount量是取值列,新列使用标题FState、Cstate、NState、TState、PState。
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