常用概念
- 维度确定数据在可视化中的分组方式,维度通常指时间、地点或者分类
- 度量是指某些类别的计算结果,通常是聚合的集合
加载数据
以下截图为加载数据的基本步骤:
- 新建APP之后打开数据加载编辑器
- 在数据加载编辑器中创建数据链接
- 如果需要删除数据,注释掉该数据加载的代码片段即可
- 链接创建完毕后,点击加载数据,加载完毕后即可进行相关分析
关于加载数据中的一些注意事项:
- 加载多个表时,如果多个表之后存在字段名相同,系统会自动创建一个Syn的合成字段(是这些字段的组合),因此需要判断这些字段在不同表格中的含义是否一样
- 对于数据模型的选取:如果侧重性能,则选取大宽表;如果是追求最小的数据冗余,则选用雪花模型
- 不建议在Qlik中做一些数据模型的搭建工作,会导致数据处理的时间过长,如果允许,最好还是在数据库中或者单独出中间层来做数据处理
面板介绍
APP面板
分析面板
Qlik 常用可视化图表
- 条形图
常用设置:
- 显示设置
- 显示大量维度值:当维度值的数量超出可视化的宽度时,会显示一个带有滚动条的小型图表
- 显示超出范围的值:在属性面板的外观下,可以设置度量轴的范围限制,默认为自动。如果有特殊需求,可以手动改变维度显示的范围
- 在堆叠条形图中显示大量数据:当堆叠条形图中有大量维度数据时,条形的总值总是可以正确显示。但是维度片段的颜色和大小可能会存在显示误差,同时,并非所有维度都会显示在堆叠图中,无法显示的维度将会标记为灰色区域。要移除灰色区域,可以使用属性面板中的属性限制
-
折线图
折线图用于显示一段时间内的趋势,维度始终位于x轴,度量始终位于y轴,不能将方向改为垂直
-
组合图可以近似的看做条形图和折线图的组合。当需要展示同一个维度下两种不同种类的度量或者两种数据两级差别很大的度量时,组合图特别有用
-
饼图是显示单个图相对于总计的占比,在具有仅含正值的单个数据系列时,可以使用饼图。若含有零值和负值时将不会显示
-
垂直表是表格最基本的形式,当我们需要查阅明细数据的具体值的时候需要用到。表格同时显示多个字段,其中每行的内容在逻辑上相互关联。
-
透视表是将维度和度量显示表格中的行和列;在透视表中,可以同时通过多个度量并以多个维度进行分析数据,可以重新排列度量和维度以获取不同的数据视图,在行和列之间来回移动度量和维度的活动称为透视。
-
瀑布图适用于描述某一个度量数值的变化过程。瀑布图的最大一个特点是:前一个条形的重点一定是下一个条形的起点
-
KPI控件用于显示业务中某些关键指标的具体数值
-
分布图用于比较数值在数据组的范围和分布,数据绘制为沿着轴的值点可选择仅显示值点,以查看值的分布。选择边界框以查看值的范围
-
仪表盘是一种类似于KPI的可视化控控件,他们的区别在于仪表盘加入了一些额外的可视化效果辅助数据展示,使得数据的可读性更强
-
散点图可以帮助您找到两个值之间的潜在关系,并对组中的不规则性实现可视化。当想要显示每个实例都有两个指标,例如不同国家和地区的每个首府的平均寿命预期值和平均国内生产总值的数据时,散点图也很有用
主条目
- 维度主条目:将维度添加为主条目时,会有单个和下钻两个选项。单个是一个主条目中只有一个维度字段,而下钻可以在一个主条目中添加多个维度字段,只是添加的字段之间需要有层级关系,而高层级在低层级之前(例如省份与国家,时间的颗粒度等)
- 度量主条目:添加方式与维度主条目相同
- 可视化主条目:将可视化添加为主条目,会将整个可视化控件(包括控件内的维度、度量以及所有设置)全部添加到可视化主条目中,如果需要对控件进行编辑,需要断开控件与可视化的链接。适用于多个sheet间某个可视化控件需要同步更新
成果共享及应用
故事
故事的目的是收集对于整个分析的见解,并根据数据创建清晰的叙述。可以将故事展示位包含一张或者多张演示文稿的时间轴,并根据传统的数据叙述结构进行展示
故事都包含在应用程序中。要构建故事,可以使用数据可视化基于时间的快照和实时数据工作表,并将他们放置在故事的时间轴上,可以添加文本和造型,使用视觉效果突出某些见解的重点和运用各种风格等,使故事编的更加具有说服力更加精彩。
基本语法
集合分析
集合分析的本质是在某一个运算公式中通过修饰符插入限定条件,已达到限定聚合范围的效果。基本机构如下
Sum({<字段1={‘’},字段2={‘’},......>}度量字段)
其中字段X表示作为筛选条件的字段,度量字段表示求和之后的字段的名字
注释
- Ctrl+K或者按//进行注释
- 可以使用Rem语句或者/* 和 * / 将代码括起来
转换数据
- 将交叉表转换为二维表
在系统原生代码前加入 CrossTable 其中后面字符是给拆分出来的列给定列名
CrossTable (Month,Sales)
LOAD
Product,
"Jan 2014",
"Feb 2014",
"Mar 2014",
"Apr 2014",
"May 2014",
"Jun 2014"
FROM [lib://advanced_script/Product.xlsx]
(ooxml, embedded labels, table is Product);
- 清除内存缓存:有时候需要删除在表写脚本期间所创建的表格
drop table Name1[,Name2[,Name3,.....']]
drop field Name1[,Name2[,Name3,.....']]
- 合并表格:使用keep和join可以将qlik中的数据进行合并,但是合并后无法看到单独的表格,这会使得表格变大,降低qlik运行速度,一些信息也会丢失
此外,连接的字段必须完全相同。连接的字段数可以是任意的
load a,b,c from table1.csv;
join load a,d from table2.csv;
Transaction:
LOAD
"Transaction ID",
"Salesman ID",
Product,
"Serial No",
"ID Customer",
"List Price",
"Gross Margin"
FROM [lib://advanced_script/Transactions.csv]
(txt, codepage is 28591, embedded labels, delimiter is ',', msq);
join(Transaction)
LOAD
"Salesman ID",
Salesman,
"Distributor ID"
FROM [lib://advanced_script/Salesman.xlsx]
(ooxml, embedded labels, table is Salesman);
- 使用Peer()和Previous()识别表格内特定的值。Peek的第二个参数是指定往前查找多少个数,Previous只能往前查找一位
[Employees Init]:
LOAD
RowNo() as row,
Date(Date) as "Date",
Hired,
Terminated,
if (rowno()=1,Hired=Terminated,peek([Employee Count],-1)+(Hired-Terminated)) as [Employee Count]
FROM [lib://advanced_script/Employees.xlsx]
(ooxml, embedded labels, table is Sheet2);
- 使用 exists():exist()函数通常与脚本中的where子句搭配使用以加载数据,如果已经在数据模型加载先关数据
dual()函数用于将数值赋值给字符串,第二个参数在之后可以作为排序的依据
//Add dummy people data
PeopleTemp:
LOAD * INLINE [
PersonID, Person
1, Jane
2, Joe
3, Shawn
4, Sue
5, Frank
6, Mike
7, Gloria
8, Mary
9, Steven,
10, Bill
];
//Add dummy age data
AgeTemp:
LOAD * INLINE [
PersonID, Age
1, 23
2, 45
3, 43
4, 30
5, 40
6, 32
7, 45
8, 54
9,
10, 61
11, 21
12, 39
];
//LOAD new table with people
People:
NoConcatenate LOAD
PersonID,
Person
Resident PeopleTemp;
Drop Table PeopleTemp;
//Add age and age bucket fields to the People table
Left Join (People)
LOAD
PersonID,
Age,
If(IsNull(Age) or Age='', Dual('No age', 5),
If(Age<25, Dual('Under 25', 1),
If(Age>=25 and Age <35, Dual('25-34', 2),
If(Age>=35 and Age<50, Dual('35-49' , 3),
If(Age>=50, Dual('50 or over', 4),
))))) as AgeBuck
Resident AgeTemp
Where Exists(PersonID);
DROP Table AgeTemp;
- Interval Match是针对多对多匹配建立一个中间表,从而使得表格能够正常连接
Events:
LOAD
EventID,
EventDate,
EventAttribute
FROM [lib://advanced_script/Events.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
Intervals:
LOAD
IntervalID,
IntervalAttribute,
IntervalEnd,
IntervalBegin
FROM [lib://advanced_script/Intervals.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
BridgeTable:
IntervalMatch (EventDate)
load Distinct IntervalBegin,IntervalEnd resident Intervals;
数据清洗
- Mapping前缀,用于在脚本中创建映射表,然后可以将映射表与ApplyMap()函数,MapSubstring()函数或Map…Using语句搭配使用
- ApplyMapping第一个参数指定Mapping表,第二个参数指定Mapping的列,第三个参数指定Mapping出错时使用的替代值
- MapSubstring()是可以将字符串中的一部分字符映射成另外的字符
- Map…Using语句也可以映射到字段中,但是它会在处理影视时将值存储在内部表的字段名称当中。
countryMap:
Mapping load * Inline[
Country,Newcountry
U.S.A,us
U.S.A.,us
U.S.,us
US,us
United States,us
United States of America,us
];
Data:
LOAD
ID,
Name,
ApplyMap('countryMap',Country,'us') as Country,
Code
FROM [lib://advanced_script/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
Data:
LOAD
ID,
Name,
ApplyMap('countryMap',Country) as Country,
Code
FROM [lib://advanced_script/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
Map Country using countryMap;
Data1:
LOAD
ID,
Name,
Country,
Code
FROM [lib://advanced_script/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
Data2:
LOAD
ID,
Name,
Country,
Code
FROM [lib://advanced_script/Data.xlsx]
(ooxml, embedded labels, table is Sheet1);
unmap; //此处指定之后的表不使用映射
层次结构
- Hierarchy前缀是放置在load或select语句前面的脚本命令,用于脚架相邻节点表、LOAD语句必须至少拥有三个字段:ID是节点的唯一秘钥,涉及父集和名称。
Hierarchy (NodeID,ParentID,NodeName)
LOAD
NodeID,
ParentID,
NodeName
FROM [lib://advanced_script/Winedistricts.txt]
(txt, utf8, embedded labels, delimiter is '\t', msq);
存储
- store:该语句将创建一个明确命名的QVD或CSV文件,该语句仅会从一个数据表格中导出字段。如果要从多个表格中到处子弹,必须明确命名之前在脚本中生成的链接以创建相应到处的数据表
store mytable into xyz.qvd (qvd);
store * from mytable into xyz.qvd