5.1.5 列的内存模型
列的内存模型如下图所示,列到内存中之前可能会分布在多个表中,他们的名字相同,进入内存就会汇聚到同一个列中。但是关联关系由表来存储。
当然,列也可以用as重命名来改变名字从而达到取消关联的目的。
如果要强调某一列col来自其中某一个表A,那么可以用load关键字给A表增加一列作为标记,在想要区分的时候看看isnull(aggr(标记,col))即可。
如果两个列在同一个表中被加载,那么选择一个列,另一个列就会联动被选中。
如果两个列不在同一个表中被加载,那么这两列通过共同的中间列(名称相同)联动。
NAMENAME1--内存NAME 1 as name_from_ANAMELOADAB数据库NAMENAME
5.1.6 5.1.7 联动显示的基础 QUALIFY加表名
严格区分来自每个表的列。各个字段对所有字段加上表名用来取消关联。
QUALIFY *;
5.1.8 UNQUALIFY
与QUALIFY的作用相反。下面的例子是对所有表中的【单项编号】字段使用自动关联。 UNQUALIFY单项编号;
注意:作用范围
可以在任意位置加上表名和取消表名,可以重复使用,每次使用都会影响后续指令的执行,不会影响之前指令的执行。
5.2 表格查看器
如果数据已经被加载到内存,通常是多个表,这些表之间的关系通过相同的字段名称来实现。可以通过【表格查看器】按钮查看当前加载的所有表,以及表之间的关联关系
来
如上图所示,三个表都有“单项编号”这个字段,从而这三个表就发生了关联。
6 后台脚本概述
脚本是QV的后台,脚本的功能是将数据加载到内存中供用户使用。但是往往用户使用的原始数据都不一定完整、或者存在脏数据、有时候
甚至需要做一些转换等等。这种加载数据的同时对数据进行清洗和预处理的工作就是QV的ETL功能。
6.1 语句
脚本以语句构成,多个语句用分号隔开 语句是从上到下依次执行。
6.1.1 逻辑判断
在帮助文档中输入等于号(=)即可看到所有的逻辑操作符使用方法。
6.1.2 集合操作
集合用一对大括号表示: { } 元素用逗号隔开:{1,2,3,4}
6.2 QV执行SQL语句
参考本文的“QV读取数据库”一节,可以看到QV在加载一个数据库表的时候会生成一条语句,例如:
SQL SELECT \单项编号\ \单项财务收入\ \财务收入确认时间\
FROM \单项财务收入\
关键字SQL表示后面紧接着是一个标准SQL语句。这个SQL语句一般是【选择】功能自动生成的。上面的SQL语句功能是从数据库“YWW_Temp_Test”中读取表“BI_单项财务收入”的“单项编号”、“单项财务收入”、“财务收入确认时间”三个字段。
脚本执行完毕就会将上述数据存放到内存中。
6.3 LOAD加载数据
QV执行SQL语句可以将数据加载到内存,如果你希望加载到内存之前对数据进行一定的预处理,比如数据清洗、修饰等,就可以使用LOAD关键字来实现。
Load语法是从数据库到内存最后一次加工过程,在这里你可以给表添加新的列,预处理列中的数据。 LOAD语句总是和SQL语句配对执行。 LOAD 语句; SQL 语句;
6.3.1 从随后的表格中加载数据
Load A, B, if(C>0,'positive','negative') as X, weekday(D) as Y; Select A,B,C,D from Table1;
6.3.2 填充特殊值
例如,下面的Load就会数据库中日期为空的值做了特殊值填充处理:
LOAD
\单项合同金额\, \单项编号\,
If(IsNull(\签回日期\),makedate( 1900 ),\签回日期\) As\签回日期\; SQL SELECT \单项合同金额\ \单项编号\ \签回日期\
FROM \合同明细\
6.3.3 添加新的列
比如你的项目类型里有各种类型,但你想对这些类型分类:设计类、非设计类。
你可以想如下这样给你的表加入内存之后添加一列(这里又添加了一列:单项编号_FROM_单项):
LOAD\单项编号\,
'1' as单项编号_FROM_单项, \项目类型\
,if(\项目类型\ = '通信设计' or\项目类型\ ='建筑设计' or\项目类型\ ='装潢设计' or\项目类型\ ='铁塔设计' or\项目类型\ ='咨询' or\项目类型\ ='网优','设计类','非设计类') as是否设计类; SQL SELECT \单项编号\ \项目类型\
FROM \单项\
加载到内存的结果如下:
7 变量与表达式
7.1 变量
脚本语言总是离不开变量,在脚本中的QV变量都是全局变量,有一些系统变量,也支持用户自定义变量。
由于语句是按顺序执行,所以要求用户自己要按照一定的规范组织脚本,否则随着要分析内容的增多,会出现脚本难以管理的局面。
如果用户提前预知脚本会越来越复杂,就会定期重构,使其一直处在阅读难度的合理水平。重构只要能够按照这个原则进行就可以不局限与比较死板的规范。
变量的定义:
定义脚本变量的语法为: setvariablename = string 或
let variable = expression
有些语句是自动生成的,比如当你新建一个qvw文档时总会出现下面的语句: SET ThousandSep=','; SET DecimalSep='.';
SET MoneyThousandSep=','; SET MoneyDecimalSep='.';
SET MoneyFormat='¥#,##0.00;¥-#,##0.00'; SET TimeFormat='h:mm:ss'; SET DateFormat='YYYY/M/D';
SET TimestampFormat='YYYY/M/D h:mm:ss[.fff]';
SET MonthNames='1月;2月;3月;4月;5月;6月;7月;8月;9月;10月;11月;12月'; SET DayNames='周一;周二;周三;周四;周五;周六;周日';
7.2 一般的统计求和方法
8 前台设计
8.1 数据的显示
数据在被加载到内存中是去除重复的,并使用引用来保持表数据的组织关系。
除此之外,数据并不一定是直接按照数据库中的方式存储的,QV会针对不同的数据保存为不同的类型,而需要展示的时候可以使用外观模式来显示不同的格式。
例如,日期数据在被存放到内存之后可以显示为整数、日期、不同格式的日期。通常在表格的“数字”属性中会专门制定数据的显示格式,如下图所示:
显示如下:
如果使用默认显示,日期可能会显示成整数:
8.2 常用控件
8.2.1
工作表
工作表是打开qvw文件时主窗口中最大的一块区域,这里用来设计各种图表。
可以在同一个文件中创建多个工作表,这些工作表使用同一个数据源,在一个工作表中做出的筛选,会让其他工作表联动作出反应。
8.2.2 透视表
维度:一个分组,类似于数据库中的group by。对一组之后每隔组内部的多个值交给表达式中的聚合函数来处理
表达式:维度会对表数据进行分组,分组之后的每一组数据,交给表达式来处理。所以,表达式通常是一些类似于sum这种聚合函数。
8.2.3 垂直表
8.2.3.1 垂直表与透视表的对比
透视表:
1.透视表更擅长于数据的分组,在透视表中你可以很轻易的看到指定的行从属于哪个分组当中,并 且每个分组都可以进行部分求和。
2.透视表可以实现和交叉表一样的展现方式,比如一个或者多个平行的维度。
3.透视表在排序的实现方式上,只能按照维度进行分组,先按照第一个维度进行排序然后按照第二 个维度进行排序等等,没有办法按照任意列进行排序。
垂直表:
垂直表在排序方面比透视表强很多,你可以按照任意列进行排序,但是垂直表不擅长数据的分组, 并且也没有像透视表那样的可以进行部分求和。
注:建议使用透视表。
8.2.4 表格框
表格框用来展示数据表中的原始数据,只需要将数据表中的列添加到表格框的属性中即可。创建表格框的方法如下:在工作表的空白处右键》新工作表对象》表格框