1.脚本关键字
1.1
LOAD
LOAD
-
LOAD 关键字类似
SQL
中select ,用于字段选择// 从Employees 中加载字段EmployeeID,Address,BirthDate,City 并将其命名为Employee 的临时表 Employee: LOAD EmployeeID, Address, BirthDate, City FROM Employees.xlsx (ooxml, embedded labels, table is Sheet1);
1.2
Resident
Resident
-
resident 用于对临时表的引用
Employee: LOAD EmployeeID, Address, BirthDate, City FROM Employees.xlsx (ooxml, embedded labels, table is Sheet1); // 防止两表做关联 NoConcatenate Employee1: LOAD EmployeeID, Address, BirthDate, City&'AA' Resident Employee; drop table Employee;
resident 引用临时表,
NoConcatenate
防止两表串联 ,&用于字段串拼接
1.3
qualify
qualify
-
在
QlikView
中只有当两个表中的字段名称完全一样时才能关联,其他情况则放弃关联。 -
加入QUALIFY 可以防止表进行关联,比如一次加载好多表,不想出现相同字段进行关联
QUALIFY *; Employee: LOAD EmployeeID, Address, BirthDate, City FROM Employees.xlsx (ooxml, embedded labels, table is Sheet1); Order: LOAD EmployeeID, CustomerID, OrderDate FROM Orders.xlsx (ooxml, embedded labels, table is Sheet1);
QUALIFY *; 加入QUALIFY * 生成两张单独的表,字段名加了表名前缀,加入
UNQUALIFY
可以指明关联的字段
1.4
unqualify
unqualify
QUALIFY *;
UNQUALIFY EmployeeID;
Employee:
LOAD
EmployeeID,
Address,
BirthDate,
City
FROM
Employees.xlsx
(ooxml, embedded labels, table is Sheet1);
Order:
LOAD
EmployeeID,
CustomerID,
OrderDate
FROM
Orders.xlsx
(ooxml, embedded labels, table is Sheet1);
指明使用
EmployeeID
进行关联,运行结果如下图
1.5
concatenate
concatenate
类似于
SQL
中UNION 但有两点不同: 第一点,无论表格是否具有相同的字段名,Concatenate 前缀都可使用;第二点,不会删除相同的记录。如果在 LOAD 语句中使用 DISTINCT 谓语,结果表将会不同。添加到表中的任何数据也会变得不同,不管数据是串联还是联接。
不推荐使用
1.6
NoConcatenate
NoConcatenate
NoConcatenate
前缀强制将两个使用相同字段集的加载表格处理为两个单独的内部表格(当它们以其他方式自动串联时)。
可以使用QUALIFY *代替
1.7
Mapping
Mapping
使用原始LOAD加载的数据
region_country:
LOAD Region,
Country
FROM
region_country.xlsx
(ooxml, embedded labels, table is Sheet1);
创建映射表,该前缀可置于
Load
或
Select (SQL)
语句之前,并将正在加载的语句的结果存储为映像表。
映像表必须有两个字段
,第一个字段包含比较值,第二个字段包含所需的映射值。映射表暂时存储在内存中,执行脚本后将自动删除。 使用 map … using 语句、rename field 语句、
Applymap()
函数或
Mapsubstring()
函数可访问映像表的内容。
MapCountryRegion:
Mapping
LOAD Region,
Country
FROM
region_country.xlsx
(ooxml, embedded labels, table is Sheet1);
使用Mapping 加载的数据
在一定程度上可以替代关联语句,但是只局限于 映射表只有两个字段,而且当表一个key有多个映射时,会默认只取一个映射。会导致数据缺失。
1.8
ApplyMap
ApplyMap
使用映射表
sales:
LOAD ProductID,
ProductCategory,
Region,
SaleAmount,
ApplyMap('MapCountryRegion',Region,'Unknown') as country
FROM
sales_regions.xlsx
(ooxml, embedded labels, table is Sheet1);
如果不使用映射表,使用连接的做法是这样
sales:
LOAD
ProductID,
ProductCategory,
Region,
SaleAmount
FROM
sales_regions.xlsx
(ooxml, embedded labels, table is Sheet1);
LEFT JOIN
LOAD Region,
Country
FROM
region_country.xlsx
(ooxml, embedded labels, table is Sheet1);
由于关联的 region 键是多对多的关系,导致数据发散,在关联条件是一对一或者多对一的情况下,使用Mapping是可以替代left join 进行映射的,但是存在的问题是Mapping 会自动舍弃一些数据,比如一个key 对应多个value,会只保留第一个key value
1.9
union
union
- 字段名一致自动进行UNION
1.10
left join
left join
-
虽然
QLIKVIEW
会根据字段相同来进行关联,但是建议显示的表示关联
1.11
EXIT Script
EXIT Script
- 打断点 脚本执行到EXIT Script 中止
1.12
peek()
peek()
QlikView
中的peek()函数用于从以前的记录中获取字段的值,并在计算中使用它。
monthly_salse:
LOAD * Inline
[Month,Sales Volume
March,2145
April,2458
May,1245
June,5124
July,7421
August,2584
September,5314
October,7846
November,6532
December,4625
January,8547
February,3265];
NoConcatenate
LOAD
Month,
[Sales Volume],
peek('Sales Volume') as Prevvolume,
([Sales Volume]-peek('Sales Volume'))/peek('Sales Volume') as Diffrence
Resident monthly_salse;
DROP TABLE monthly_salse;
load * inline 是创建自建数据,一般我们用来创建维度 peek() 获取上月数据,可以用来计算 参考资料 https://www.tutorialspoint.com/qlikview/qlikview_peek_function.htm
1.13 store into
用于保存qvd文件
1.14 filename()
获取文件的名称,在一些特出情况下好用,比如要获取文件的最大更新时间
load
max(mid(FileName(),6,6)) as max_Time
from .\test_*.xlsx;
let v_today = peek('max_Time');
*
通配符
2.图表函数
# 如果筛选框没有选择年月 默认为当月数据,否则以筛选框数据为准 计算加班
=if(isnull(GetFieldSelections(年月))=-1,
sum({<年月={'$(v_Today_Moth)'}>}正常加班),
sum({<年月={$(=$(v_time))}>}正常加班)
)
注意
:GetFieldSelections() 代表的是鼠标点击传值,
$(=$(v_time))
这个写法是表示引用计算表达式,sum({<年月-={’$(v_Today_Moth)’}>}正常加班),
注意不等于
在QlikView图表函数中表示的是
-=
;sum({<年月={‘202109’,‘202110’}>}正常加班)
3.权限控制
qlikview 使用Excel文件控制权限,权限级别份页签和字段权限
- 页签权限设置
- 字段权限设置
设置权限步骤:
- 设置–>文档属性–>打开 将基于区域访问权限的初始数据减少 严格排除 勾选
- 设置页签权限
-
脚本中设置权限
-
字段权限设置
SECTION Access; star is*; LOAD ACCESS, NTNAME, OMIT FROM [.\权限.xlsx] (ooxml, embedded labels, table is colum); SECTION Application;
OMIT代表的是设置权限的字段,如果不需要对字段设置权限,默认使用OMIT,保持设置字段的sheet页只有表头
-
页签权限设置
Sheet: LOAD //USERID, upper(NTNAME) as NTNAME, ITO_KPI, FROM [.\权限.xlsx] (ooxml, embedded labels, table is Sheet1);
ITO_KPI代表的是设置页签的名字,要设置多个页签直接后面加
-
-
权限Excel 样式
- 设置页签的权限
- 设置字段的权限
注意如果要设置用户拥有字段的所有权限可以设置为
*
,但是设置为
*
的前提是要让Excel知道
*
总共有几种,所以一般建议admin ,将所有情况进行遍历,其他用户如果要拥有所有权限设置为
*
4.导出到Excel
导出Excel适用于报表之间引用,逻辑复杂,直接导出在另一个报表中引用(适用与图表中很多计算,无法再脚本中直接 store into 保存),在工具–>编辑模块 中编辑 VB脚本
sub Export2Excel
vPath =".\test"
set obj = ActiveDocument.GetSheetObject("CH25")
obj.ExportEx vPath&"\FCST_VBA_TEST.csv",1
end sub
一般建议不要再图表中进行过多运算,运算都在脚本中进行计算,这样便于复用
5.常用快捷键
-
Ctrl + E
: Edit 编辑脚本 -
Ctrl + L
: Load加载数据 -
Ctrl + T
: Table 查看数据模型 -
Ctrl + G
: design grid -
Ctrl + M
: edit module -
Ctrl + Alt + V
: variable overview -
Ctrl + Alt + E
: expression overview -
Ctrl + Alt + S
: sheet properties -
Ctrl + Alt + D
: document properties