cube vs rollup
- 格式:docx
- 大小:56.38 KB
- 文档页数:2
Oracle ROLLUP和CUBE 用法rollup只有第一个参数起作用也是理解不正确的,先看看例子吧:SQL> select grade,id,num from a;GRADE ID NUM---------- ---------- ----------a 1 1a 2 2b 3 4b 4 4对grade字段进行rollup:SQL> select grade,sum(num) from a group by rollup(grade);GRADE SUM(NUM)---------- ----------a 3b 811同时对grade和id字段进行rollupSQL> SELECT decode(grouping_id(grade,ID),2,'小计',3,'合计',grade) grade,2 decode(grouping_id(grade,ID),1,'小计',3,'合计',ID) ID,3 SUM(num)4 FROM a GROUP BY ROLLUP(grade,ID)5 /GRADE ID SUM(NUM)---------- ---------- ----------a 1 1a 2 2a 小计 3b 3 4b 4 4b 小计 8合计合计 11再看看先对grade分组,再对id进行rollup的情况:SQL> SELECT grade,2 decode(GROUPING(ID),1,'合计',ID) ID,3 SUM(num)4 FROM a GROUP BY grade,rollup(ID)5 /GRADE ID SUM(NUM)---------- ---------- ----------a 1 1a 2 2a 合计 3b 3 4b 4 4b 合计 86 rows selected这里GROUP BY grade,rollup(ID)跟你的理解应该很相近了,而且可以看出GROUP BY grade,rollup(ID)结果跟ROLLUP(grade,ID)很类似,只是少了最后1行总合计,但是也可以就看出rollup多个字段时并不是只有1个字段起作用的可以认为你理解的是只对第一个字段的累计,跟GROUP BY grade,rollup(ID)的结果很接近,再看rollup3个字段的情况:SQL> select part,grade,id,num from a;PART GRADE ID NUM---- ---------- ---------- ----------p1 a 1 1p1 a 2 2p1 b 3 3p1 b 4 4p2 c 5 5p2 d 6 6SQL>SQL> SELECT decode(grouping_id(part,grade,ID),7,'总计',part) part,2 decode(grouping_id(part,grade,ID),3,'小计',7,'总计',grade) grade,3 decode(grouping_id(part,grade,ID),1,'小计',3,'小计',7,'总计',ID) ID,4 SUM(num)5 FROM a GROUP BY ROLLUP(part,grade,ID)6 /PART GRADE ID SUM(NUM)---- ---------- ---------- ----------p1 a 1 1p1 a 2 2p1 a 小计 3p1 b 3 3p1 b 4 4p1 b 小计 7p1 小计小计 10p2 c 5 5p2 c 小计 5p2 d 6 6p2 d 小计 6p2 小计小计 11总计总计总计 2113 rows selected这里不光只对第一个字段做了累计,先按(part,grade,ID)分组累计,然后按(part,grade)分组累计,再按(part)分组累计,最后累计全部再看看rollup 和 cube的区别:对于ROLLUP(part,grade,ID),grouping_id(part,grade,ID)的值范围在(0,1,3,7)间即part,grade,ID(作为合计时计为1)0,0,00,0,10,1,11,1,1而对于cube(part,grade,ID),grouping_id(part,grade,ID)的值范围在0-7之间即part,grade,ID(作为合计时计为1)0,0,00,0,10,1,00,1,11,0,01,0,11,1,0CREATE TEST TABLE AND INSERT TEST DATA.create table students(id number(15,0),area varchar2(10),stu_type varchar2(2),score number(20,2));insert into students values(1, '111', 'g', 80 ); insert into students values(1, '111', 'j', 80 ); insert into students values(1, '222', 'g', 89 ); insert into students values(1, '222', 'g', 68 ); insert into students values(2, '111', 'g', 80 ); insert into students values(2, '111', 'j', 70 ); insert into students values(2, '222', 'g', 60 ); insert into students values(2, '222', 'j', 65 ); insert into students values(3, '111', 'g', 75 ); insert into students values(3, '111', 'j', 58 ); insert into students values(3, '222', 'g', 58 ); insert into students values(3, '222', 'j', 90 ); insert into students values(4, '111', 'g', 89 ); insert into students values(4, '111', 'j', 90 ); insert into students values(4, '222', 'g', 90 ); insert into students values(4, '222', 'j', 89 ); commit;col score format 999999999999.99ROLLUPselect id,area,stu_type,sum(score) scorefrom studentsgroup by rollup(id,area,stu_type)order by id,area,stu_type;/*--------理解rollupselect a, b, c, sum( d )from tgroup by rollup(a, b, c);等效于select * from (select a, b, c, sum( d ) from t group by a, b, c union allselect a, b, null, sum( d ) from t group by a, b union allselect a, null, null, sum( d ) from t group by aunion allselect null, null, null, sum( d ) from t)*/CUBEselect id,area,stu_type,sum(score) scorefrom studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;/*--------理解cubeselect a, b, c, sum( d ) from tgroup by cube( a, b, c)等效于select a, b, c, sum( d ) from tgroup by grouping sets(( a, b, c ),( a, b ), ( a ), ( b, c ),( b ), ( a, c ), ( c ),() ))*/GROUPING从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!select decode(grouping(id),1,'all id',id) id,decode(grouping(area),1,'all area',to_char(area)) area,decode(grouping(stu_type),1,'all_stu_type',stu_type) stu_type, sum(score) scorefrom studentsgroup by cube(id,area,stu_type)order by id,area,stu_type;。
OLAP是一个赋予动态的、企业分析的名词,这些分析是注释的、熟悉的、公式化数据分析模型的生成、操作、激活和信息合成。
能够在变量间分辨新的或不相关的关系,能够区分对处理大量数据必要的参数,而生成一个不限数量的维和指明跨维的条件表达式。
OLAP是针对特定问题的联机数据访问和分析。
通过信息(维数据)的多种可能的观察形式进行快速、稳定一致和交互性的存取,允许管理决策人员对数据进行深入观察。
OLAP特点:1.假定性:需要初始的假设来给出导航数据分析的方向,最终用分析的结果来验证初始的假设。
2.快速性:用户对OLAP的快速反映能力有很高的要求。
3.可分析性:能处理与应用有关的任何逻辑分析和统计分析。
用户可以在OLAP平台上进行分析,也可以连接到其他外部分析工具上。
4.多维性:是OLAP的关键属性,系统提供对数据分析的多维视图和分析,如对层次维和多重层次维完全支持。
5.信息性:系统能及时获取信息,并能管理大容量的信息。
OLAP分类:1.关系OLAP(ROLAP)结构:使用关系或扩充关系DBMS存放并管理数据仓库,采用基于稀疏矩阵表示方法的星形结构或雪花结构存储多维数据,数据检索比MOLAP低效。
2.多维OLAP(MOLAP)结构:核心是其数据存储采用矩阵(可能是多维方阵)方式,数据检索高效。
3.混合OLAP(HOLAP)结构:结合ROLAP和MOLAP技术,在MOLAP立方体中存储高级别的聚集,在ROLAP中存储低级别的聚集。
4.桌面OLAP结构:没有自己的数据存储库,把用户的查询翻译为对数据源的查询,然后再把结果合成返回给用户。
5.客户OLAP:相对与Server OLAP,把部分数据下载到本地,为用户提供本地的多维分析。
OLAP常用分析方法:1.数据切片(Slicing)和数据切块(Dicing)2.钻取:数据上钻(Drilling-up)、数据下钻(Drilling-down)、数据上卷(Rolling-up)3.数据旋转(Pivoting/Rotating)-概括来说,数据仓库系统是指具有综合企业数据的能力,能够对大量企业数据进行快速和准确分析,辅助做出更好的商业决策的系统。
BW知识问答锦集2PM面试分为BW、BO两部分,根据顾问的简历和应聘的岗位所侧重的问题不同。
BW包括基础知识、增量、增强、LO抽取、数据源。
BO包括CR、CR、WEBI、UNI。
一、基础知识技术面试1、BW中的数据对象有Info Object,Cube,DSO,Info set,Multi-provider,visual provider. 其中IO,Cube,DSO是实际的物理存储对象,Info set和Multi-provider可以理解成为建立在其他物理存储对象上的视图,是不存储数据滴2、接上一点,那为什么要用到Info set和Multi-Provider呢?那要从BEx报表的展现机制来说了.在BEx报表设计中,你只能选取一个Info provider作为数据池来构建你的报表,如果你所需要的数据放在多个Cube或者DSO里面的话,那么你就需要一个工具把这些info provider 集合在一起变成一个info provider,这个工具就是info set 或者是Multi-provider3、还是接着上一点,说得这里别人面你的时候就肯定顺水推舟的问你Info set 和Multi-provider的区别是什么:info set 连接方式取的是数据的交集,而Multi-provider取的是数据的并集。
4、Info Object是BW中最小的存储单位.5、DSO分为标准DSO,写优化DSO,直接更新的DSO.6、实际的项目大多数喜欢用3层的数据模型,底层是写优化的DSO,记录delta和保证数据与PSA的一致,第二层用标准DSO,第三层用Cube…用level 1的DSO更新level 2的DSO的时候,一般都用SUM的方式.27、建立模型时的导航属性具体含义是什么? 是在做查询的时候用的,过程是这样的,首先在主数据的导航属性里面选择某一个字段,例如物料主数据的物料组设置成了导航属性,然后在INFOCUBE里面还有一个设置导航属性的地方,这里就是该INFOCUBE里面全部特性的导航属性的和(如果在特性里面没有选择导航属性,在INFOCUBE里面也找不到),在INFOCUBE也选中该属性为导航属性后,物料组就可以作为物料的一个导航属性存在了,在做查询的时候,物料组(在特性里面物料的下拉菜单中就会出现)就可以成为一个查询条件了或者做其他限制了。
oracle Rollup 和Cube用法Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
如果是ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),(C),最后对全表进行GROUP BY操作。
grouping_id()可以美化效果:Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。
除本文内容外,你还可参考:分析函数参考手册:/post/419/33028分析函数使用例子介绍:/post/419/44634SQL> create table t as select * from dba_indexes;表已创建。
SQL> select index_type, status, count(*) from t group by index_type, status;INDEX_TYPE STATUS COUNT(*)--------------------------- -------- ----------LOB V ALID 51NORMAL N/A 25NORMAL V ALID 479CLUSTER V ALID 11下面来看看ROLLUP和CUBE语句的执行结果。
SQL> select index_type, status, count(*) from t group by rollup(index_type, status);INDEX_TYPE STATUS COUNT(*)--------------------------- -------- ----------LOB V ALID 51LOB 51NORMAL N/A 25NORMAL V ALID 479NORMAL 504CLUSTER V ALID 11CLUSTER 11566已选择8行。
数据库中如何分类、分组并总计SQL数据您需要了解如何使用某些SQL子句和运算符来安排SQL数据,从而对它进行高效分析。
下面这些建议告诉您如何建立语句,获得您希望的结果。
以有意义的方式安排数据可能是一种挑战。
有时您只需进行简单分类。
通常您必须进行更多处理——进行分组以利于分析与总计。
可喜的是,SQL提供了大量用于分类、分组和总计的子句及运算符。
下面的建议将有助于您了解何时进行分类、何时分组、何时及如何进行总计。
1、分类排序通常,我们确实需要对所有数据进行排序。
SQL的ORDER BY子句将数据按字母或数字顺序进行排列。
因此,同类数据明显分类到各个组中。
然而,这些组只是分类的结果,它们并不是真正的组。
ORDER BY显示每一个记录,而一个组可能代表多个记录。
2、减少组中的相似数据分类与分组的不同在于:分类数据显示(任何限定标准内的)所有记录,而分组数据不显示这些记录。
GROUP BY子句减少一个记录中的相似数据。
例如,GROUP BY能够从重复那些值的源文件中返回一个的邮政编码列表:SELECT ZIPFROM CustomersGROUP BY ZIP仅包括那些在GROUP BY和SELECT列列表中字义组的列。
换句话说,SELECT列表必须与GROUP列表相匹配。
只有一种情况例外:SELECT列表能够包含聚合函数。
(而GROUP BY不支持聚合函数。
)记住,GROUP BY不会对作为结果产生的组分类。
要对组按字母或数字顺序排序,增加一个ORDER BY子句(#1)。
另外,在GROUP BY子句中您不能引用一个有别名的域。
组列必须在根本数据中,但它们不必出现在结果中。
3、分组前限定数据您可以增加一个WHERE子句限定由GROUP BY分组的数据。
例如,下面的语句仅返回肯塔基地区顾客的邮政编码列表。
SELECT ZIPFROM CustomersWHERE State = 'KY'GROUP BY ZIP在GROUP BY子句求数据的值之前,WHERE对数据进行过滤,记住这一点很重要。
order by 、group by 、having的用法区别order by 从英文里理解就是行的排序方式,默认的为升序。
order by 后面必须列出排序的字段名,可以是多个字段名。
group by 从英文里理解就是分组。
必须有“聚合函数”来配合才能使用,使用时至少需要一个分组标志字段。
什么是“聚合函数”?像sum()、count()、avg()等都是“聚合函数”使用group by 的目的就是要将数据分类汇总。
一般如:select 单位名称,count(职工id),sum(职工工资) form [某表]group by 单位名称这样的运行结果就是以“单位名称”为分类标志统计各单位的职工人数和工资总额。
在sql命令格式使用的先后顺序上,group by 先于order by。
select 命令的标准格式如下:SELECT select_list[ INTO new_table ]FROM table_source[ WHERE search_condition ][ GROUP BY group_by_expression ][ HA VING search_condition ]1. GROUP BY 是分组查询, 一般GROUP BY 是和聚合函数配合使用group by 有一个原则,就是select 后面的所有列中,没有使用聚合函数的列,必须出现在group by 后面(重要)例如,有如下数据库表:A B1 abc1 bcd1 asdfg如果有如下查询语句(该语句是错误的,原因见前面的原则)select A,B from table group by A该查询语句的意图是想得到如下结果(当然只是一相情愿)A Babc1 bcdasdfg右边3条如何变成一条,所以需要用到聚合函数,如下(下面是正确的写法):select A,count(B) as 数量from table group by A这样的结果就是A 数量1 32. Havingwhere 子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
在数据库中如何分类、分组并总计SQL数据您需要了解如何使用某些SQL子句和运算符来安排SQL数据,从而对它进行高效分析。
下面这些建议告诉您如何建立语句,获得您希望的结果。
以有意义的方式安排数据可能是一种挑战。
有时您只需进行简单分类。
通常您必须进行更多处理——进行分组以利于分析与总计。
可喜的是,SQL提供了大量用于分类、分组和总计的子句及运算符。
下面的建议将有助于您了解何时进行分类、何时分组、何时及如何进行总计。
欲了解每个子句和运算符的详细信息,请查看在线书籍。
#1:分类排序通常,我们确实需要对所有数据进行排序。
SQL的ORDER BY 子句将数据按字母或数字顺序进行排列。
因此,同类数据明显分类到各个组中。
然而,这些组只是分类的结果,它们并不是真正的组。
ORDER BY显示每一个记录,而一个组可能代表多个记录。
#2:减少组中的相似数据分类与分组的最大不同在于:分类数据显示(任何限定标准内的)所有记录,而分组数据不显示这些记录。
GROUP BY子句减少一个记录中的相似数据。
例如,GROUP BY能够从重复那些值的源文件中返回一个唯一的邮政编码列表:SELECT ZIPFROM CustomersGROUP BY ZIP仅包括那些在GROUP BY和SELECT列列表中字义组的列。
换句话说,SELECT列表必须与GROUP列表相匹配。
只有一种情况例外:SE LECT列表能够包含聚合函数。
(而GROUP BY不支持聚合函数。
)记住,G ROUP BY不会对作为结果产生的组分类。
要对组按字母或数字顺序排序,增加一个ORDER BY子句(#1)。
另外,在GROUP BY子句中您不能引用一个有别名的域。
组列必须在根本数据中,但它们不必出现在结果中。
#3:分组前限定数据您可以增加一个WHERE子句限定由GROUP BY分组的数据。
例如,下面的语句仅返回肯塔基地区顾客的邮政编码列表。
SELECT ZIPFROM CustomersWHERE State = 'KY'GROUP BY ZIP在GROUP BY子句求数据的值之前,WHERE对数据进行过滤,记住这一点很重要。
函数:1、INITCAP(‘字符串’ )返回字符串并将第一个字母大写:select INITCAP('1test word TEST two')from dual;1test Word Test Two即首个字符是数字时,本单词不大写,后面的每个字符串分段,空格、下划线,都将大写第一个字母。
2、INSTR(‘字符串’,‘需要搜索字符’,起始位置,第几次出现)select instr('oracle traning','ra',1,2)from dual;93、LENGTH(‘字符串’)select length('test_name')from dual;94、LOWER(‘字符串’) UPPER(‘字符串’)将目标字符串全部大写或者小写返回select lower('Test_NAME_1NAME')FROM DUAL;test_name_1name5、RPAD() 和LPAD()在字符串左边或者右边粘贴字符,并返回定长字符select rpad(lpad('jason',12,'*'),15,'#')from dual;*******jason###6、TRIM()默认删除首位的空格,还有ltrim()和rtrim()select trim(' test_word and so on ')resultfrom dual;test_word and so onselect trim(trailing'o'from'test_word_andsoo')from dual;test_word_andsSELECT trim(leading'2'from'213dsq12')FROM dual;13dsq12SELECT trim(both'2'from'213dsq12')FROM dual;13dsq1select ltrim('test_name_and so on','ets')from dual;_name_and so on关键是第一个要删除的字符就得匹配,不然删除不了一个。
Cube与Rollup函数详解[SQLServer]为了简单起见,假设如下表:DI1 ID2 MyValue---------------------------A X 2A X 1A Y 2A Y 1B X 3B Y 2B Y 2使⽤SUM()函数对第三个列值总计:SELECT ID1,ID2,SUM(MyValue)FROM #SampleGROUP BY ID1,ID2返回结果:ID1 ID2 (⽆列名)A X 3B X 3A Y 3B Y 4Cube和Rollup从分组的查询中取得结果,对第⼀列的值或者每个出现在Group By列列表中的所有列值的组合应⽤相同的聚合函数。
Rollup函数这是对Group By列列表的第⼀列进⾏⼩计和总计计算的最简单的⽅法。
在假想的例⼦中,除计算每个唯⼀的列值的总和以外,还需计算DI1列中A和B⾏的总和。
SELECT ID1,ID2,SUM(MyValue)FROM #SampleGROUP BY ID1,ID2WITH ROLLUP结果如下:ID1 ID2 (⽆列名)-------------------------A X 3A Y 3A NULL 6B X 3B Y 4B NULL 7NULL NULL 13空值表⽰在计算聚合值时忽略相关的列。
Cube函数Cube运算符是对Rollup运算符的扩展。
Cube不⽤于为GROUP BY列表中的第1列积累聚合值,⽽是对每个分组的列值执⾏积累。
SELECT ID1,ID2,SUM(MyValue)FROM #SampleGROUP BY ID1,ID2WITH CUBE结果:ID1 ID2 (⽆列名)-------------------------A X 3B X 3NULL X 6A Y 3B Y 4NULL Y 7NULL NULL 13A NULL 6B NULL 7第1列中的空值表⽰该列值是第2列的值的积累。
use教学库 u se教学库
select专业,性别,COUNT(*)as人数select专业,性别,COUNT(*)as人数
from学生from学生
groupby专业,性别groupby性别,专业
use教学库use教学库
select专业,性别,COUNT(*)as人数select专业,性别,COUNT(*)as人数
from学生from学生
groupby专业,性别groupby性别,专业
withcube withcube
注:①以上两种情况,结果集的顺序由group by后面最后一个字段的顺序决定;
②with cube是在分组的基础上,先统计group by后面最后一个字段(如:性别)每个分组
(如:男、女)的小计和最后一个字段的总计;再统计group by后面其余字段(如:专业)每个分组(如:ART、CS、IS、MA)的小计。
use教学库use教学库
select专业,性别,COUNT(*)as人数select专业,性别,COUNT(*)as人数
from学生from学生
groupby专业,性别groupby性别,专业
withrollupwithrollup
注:①对于rollup 的情形,结果集的顺序有group by 后面第一个字段(如:专业)的顺序
决定;
②with rollup 是在分组的基础上,只统计group by 后面第一个字段(如:专业)每个分组
(如:ART 、CS 、IS 、MA )的小计和最后一个字段的总计;。