关于sql:给一句-SQL-就能做多维分析

9次阅读

共计 5155 个字符,预计需要花费 13 分钟才能阅读完成。

【摘要】

多维分析程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷,去乾学院看个到底:给一句 SQL 就能做多维分析!
《把 Excel 透视表搬到 WEB 上》咱们以 Excel 文件数据集为例,介绍了如何把 Excel 的数据透视表嵌入到俺的应用程序中。爱学习的同学会问了,Excel 数据透视表能够应用 Excel 里取到的任何数据,比方数据库取数,你们能间接从数据库取数做剖析吗?Yes,I Can!

俺的程序反对对任何数据库做 SQL 数据集多维分析,只需先把数据源配置好,而后程序猿啪啪几下敲下须要进行多维分析的 SQL 语句就能够,灵便便捷!

好了,言归正传,注释马上开始!

定义物理数据源

增加 SQL 数据集时首要任务就是先在 [web 利用根目录]/WEB-INF/raqsoftConfig.xml 中定义好要应用的物理数据源。

<DBList>

<DB name="dqldemo">

<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property>

<property name="driver" value="org.hsqldb.jdbcDriver" ></property>

<property name="type" value="13" ></property>

<property name="user" value="sa" ></property>

<property name="password" ></property>

… …

</DB>

… …

</DBList> 

<DBList>

<DB name="dqldemo">

<property name="url" value="jdbc:hsqldb:hsql://127.0.0.1/demo" ></property>

<property name="driver" value="org.hsqldb.jdbcDriver" ></property>

<property name="type" value="13" ></property>

<property name="user" value="sa" ></property>

<property name="password" ></property>

… …

</DB>

… …

</DBList> 

界面增加 SQL 数据集

物理数据源创立好后,接下来最重要的一步就是增加 SQL 数据集了。只需抉择物理数据源,写上 SQL 语句,点击 查问数据,缓存入文件 保留就 ok 了!没错,就是这么不便!

数据集创立实现后万事俱备只欠东风,接下来就能够开始多维分析的体验之旅了。

点击【增加报表】,抉择数据集,填写报表名称【确定】,齐活!

数据集有了,剖析指标有了,当初就能够任性拖拽你想要查问的指标了,对 SQL 数据集的剖析也能像文件剖析从单机一步跃升 WEB 环境了,是不是又找到了倍儿爽的感觉?哈哈

先拖拽几个指标找找手感:

咦?咋列名都是代码,不是中文?这样感觉不敌对!同学,这个问题提的好,其实答案很简略,剖析进去的报表列名就是用的 SQL 数据集的字段名,所以只有使 SQL 数据集返回的字段名是中文就行!

利用 AS 返回中文字段名

批改数据集 SQL 后,点击 从新查问数据 缓存入文件,再次增加报表,发现字段名变成中文了吧!

怎么样,看着难受了吧,一不小心又 get 到新技能!不过看了下面的后果爱发问的同学可能又有想法了:部门怎么显示的是编号,这 0123 代表啥俺又不晓得,那咋做剖析?哈哈,小编猜到你的想法,早有筹备,啧啧。。。

LEFT JOIN 搞定编号代码显示

把部门编号显示成部门名称,百变不离其中,还是取决于 SQL 数据集的 SQL 语句。通过 LEFT JOIN 做多表关联就能够轻松搞定!

好了,通过下面的学习有没有发现其实数据集全是由 SQL 语句决定的,这里的 SQL 语句只有合乎 SQL 规范语法就行,比方能够通过 AS 对字段重命名,LEFT JOIN 多表关联实现名称的显示等等,总之一句话:所有向 SQL 看齐!

利用 Tag 标签增加 SQL 数据集

除了上述这种在界面上增加 SQL 数据集的形式外,其实还能够通过 Tag 标签增加。

SQL 数据集和文件数据集在 Tag 标签的应用大同小异,只是属性略有不同。

Tag 标签增加 SQL 数据集:

<raqsoft:analysev2

dataSource="dqldemo"  // 指定 SQL 须要应用的物理数据源

sql="select * from EMPLOYEE" //SQL 语句

… …

> 

<raqsoft:analysev2

dataSource="dqldemo"  // 指定 SQL 须要应用的物理数据源

sql="select * from EMPLOYEE" //SQL 语句

… …

> 

在 Tag 标签中增加 SQL 数据集,拜访多维分析页面时会将该数据集默认作为初始数据集,并间接将后果集以明细的模式展示在页面中。

重视细节的同学是不是又发现了端倪?怎么应用 Tag 标签增加数据集时没有点击【查问数据,缓存入文件】后果也能失常展示呢?难道这两种增加数据集的形式还有什么不同吗?

哈哈,迷糊了吧,烟雾弹扔的真见效

其实这两种形式的底层对数据的解决机制是一样的,惟一的不同点就是 Tag 标签增加数据集能够了解为是间接为剖析页面设置了初始数据集,这个时候程序会主动生成临时文件,而后将计算结果存入,这样一来就不必劳您大驾再入手缓存了。不过如果您还须要持续在页面上对初始数据集批改或者增加新的数据集,那就还得按最开始讲的那样儿,每次批改 SQL 语句后,都须要点击 【查问数据,缓存入文件】 从新生成了临时文件了。默认临时文件命名规定是以工夫毫秒数组合而成。

怎么样,SQL 数据集在俺本人的应用程序里用起来是不是也超便捷?不论是在页面数据集菜单中增加还是在 Tag 标签里增加,其实都是先让集算器通过 SQL 取数,而后将返回的后果集缓存入临时文件,之后在页面上的多维分析就都是基于这个长期数据文件取数了。这样一来,借用集算器的计算能力,在界面上就能做拖拽分组、聚合、过滤等等数据分析动作了。

对于缓存文件的生命周期小编还是要多唠叨几句,简略分为如下三点:

1、当缓存文件的父目录门路中蕴含”temp”字样时,如:/Raqsofttemp/_.txt 或 /temp/_.txt,程序会在 Session 超时时主动清理该缓存文件

2、生成缓存文件时,如果发现缓存文件不存在,则会主动依据数据集的配置从新生成缓存文件

3、如果缓存文件门路中没有 temp 字样,则不会对缓存文件做任何删除解决,由客户的零碎本人治理这些缓存文件的生命周期

缓存文件的后缀是.txt,聪慧的你必定就能猜润乾报表是用 TXT 文件作为中介的,但 TXT 文件的性能有点差,而且数据类型也不那么准确,个别情况会出点小错。其实从 SQL 中读出来的数据曾经是二进制格局,再转成文本保留有点费时费力不讨好。

那么,还能怎么弄?

润乾报表提供了二进制格局的缓存文件!!!

二进制缓存文件晋升性能

关上 [WEB 利用根目录]/raqsoft/guide/jsp/olap.jsp 增加如下 JS API 脚本:

<script>

guideConf.dataFileType = 'binary'; //binary 是二进制文件,会以游标形式读取,能反对超出内存的数据集;该属性的默认为 text 文本文件类型。</script> 

<script> guideConf.dataFileType = 'binary'; //binary 是二进制文件,会以游标形式读取,能反对超出内存的数据集;该属性的默认为 text 文本文件类型。</script> 

好了,设置完了,再缓存时就是以二进制文件的类型保留临时文件了。

咋样,是不是超简略?超便当?超喜爱?

不过话又说回来,下面这种缓存入文件的形式对于数据量不大的状况没问题,但有时候咱们心愿利用数据库的计算能力(毕竟数据库还能够集群散布等),那又该怎么办呢?

不要慌,润乾报表帮你忙!

非缓存 SQL 数据集

在 JSP 脚本中增加不须要缓存数据的 SQL 数据集。操作起来也不难,只先敲上一个做原始查问的 SQL 语句就行。

将 SQL 语句传递给数据库做查问,查问后剖析界面会间接将后果集中的字段列出,进行拖拽就能够了。

上面以一个多表查问做举例,在 [demo 利用根目录]/raqsoft/guide/jsp/olap.jsp 增加 JS API 进行设置。

<script>

guideConf.sqlId="<%=sqlId%>";// 指定 sqlid

var sqlDatasets = \[

{

sqlId:"sqlId1" // 指定数据集名称,不可反复

,dataSource:"dqldemo" // 指定 SQL 语句所应用的数据源

,sql:"SELECT EMPLOYEE.Name as 雇员姓名,DEPARTMENT.NAME as 部门,EMPLOYEE.COUNTRY as 国家 FROM EMPLOYEE LEFT JOIN DEPARTMENT ON EMPLOYEE.DEPTID=DEPARTMENT.ID" // 指定数据集 SQL 语句

,fields:null

},

… …

\]

… …

</script> 

<script> guideConf.sqlId="<%=sqlId%>";// 指定 sqlid

var sqlDatasets = [

{

sqlId:"sqlId1" // 指定数据集名称,不可反复

,dataSource:"dqldemo" // 指定 SQL 语句所应用的数据源

,sql:"SELECT EMPLOYEE.Name as 雇员姓名,DEPARTMENT.NAME as 部门,EMPLOYEE.COUNTRY as 国家 FROM EMPLOYEE LEFT JOIN DEPARTMENT ON EMPLOYEE.DEPTID=DEPARTMENT.ID" // 指定数据集 SQL 语句

,fields:null

},

… …

]

… … </script> 

脚本增加实现后,拜访剖析页面时只须要在 URL 里为 sqlId 参数传入数据集名称,如下图所示,应用名称为 sqlId1 的数据集:

将 SQL 数据集作为数据起源设置后,就能针对这个数据集剖析了,但剖析过程不会像缓存入文件类型的数据集那样事后加载这个数据集的数据,而是通过在这个 SQL 上追加更多的查问条件、分组、聚合子句形式实时在数据库中查问的,如:
select f1 , sum(f2) from (${ 原始 sql}) t where … group by …. having ….

简略 SQL 晋升性能

基于下面这种做法,对性能有高要求的同学预计会有情绪了,很多 DB 不会优化,这样做就会搞的很慢,体验并不好。

哈哈,莫捉急,为了进步性能咱们针对简略 SQL 还有更智能的主动改善性能的伎俩,所谓简略 SQL 就是单表无分组的 SQL 语句。SQL 会在被解析后再重组 SQL,而不是用比较慢的子查问语句。不过当 SQL 中蕴含 JOIN、分组、子查问、UNION 等简单查问性能时,因为无奈进行拆解,因而程序还是会主动选用子查问形式进行解决。

设置单表无分组的简略 SQL:

<script>

guideConf.sqlId="<%=sqlId%>";// 指定 sqlid

var sqlDatasets = \[

{

sqlId:"sqlId1" // 指定数据集名称,不可反复

,dataSource:"dqldemo" // 指定 SQL 语句所应用的数据源

,sql:"SELECT * from 客户" // 指定数据集 SQL 语句

,fields:null

},

… …

\]

… …

</script> 

<script> guideConf.sqlId="<%=sqlId%>";// 指定 sqlid

var sqlDatasets = [

{

sqlId:"sqlId1" // 指定数据集名称,不可反复

,dataSource:"dqldemo" // 指定 SQL 语句所应用的数据源

,sql:"SELECT * from 客户" // 指定数据集 SQL 语句

,fields:null

},

… …

]

… … </script> 

拜访剖析页面,拖拽指标,如下图所示:

像下面例子这样最终拖拽后基于原始 SQL”select from 客户” 生成的 SQL 语句为:SELECT 地区 地区, 城市 城市,count(客户 ID) 客户 ID 计数 FROM 客户 t GROUP BY 地区, 城市*。

好了,对 SQL 数据集多维分析的介绍就告于段落了,当初咱们来回顾一下心路历程:

能够看到咱们从能够缓存的大量数据,到利用数据库计算能力的大量数据都有很好的解决方案,同时还提供了相应的性能晋升伎俩。不过,俺们 WEB 多维分析的超能力可不仅仅如此,比方还能随便批改报表剖析的表格款式、通过建模来读取维度和指标信息等等,想要学习润乾报表多维分析更多常识,欢送拜访乾学院(c.raqsoft.com.cn)。

正文完
 0