关于Rollup 和 Cube的文章,网络上有很多,只要输入关键字随便到哪个搜索引擎都可以搜到大量的相关文章。
比如这样几篇文章就不错:
http://industry.ccidnet.com/pub/article/c1105_a79297_p1.html
http://linux.ccidnet.com/pub/article/c322_a79386_p1.html
使用方法:
一般用在group by 语句中,在sql server中用法是:group by ??? with rollup | cube ,在oracle中的用法是 group by rollup | cube(????)
虽然写法不一样,但是功能都是一样的,
rollup会根据分组情况分别添加小计和总计记录。
例子:
<%
Set Db = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
mmm="driver={SQL Server};server=192.1.1.21;uid=sa;pwd=;database=gwjp2"
db.Provider="MSDataShape"
db.Open mmm
Dim CommandText
CommandText = "Select CASE WHEN (Grouping(dwname)=1) THEN '总计' ELSE dwname END AS dwName, "
CommandText = CommandText & " CASE WHEN (Grouping(gwName)=1) THEN '小计' ELSE gwname END AS gwName,"
CommandText = CommandText & " count(*) as count,"
CommandText = CommandText & " Sum(gwlevel) as gwlevel"
CommandText = CommandText & " from tzl"
CommandText = CommandText & " Group By dwname,gwname WITH rollup "Response.write CommandText
Response.Write "<hr>"
rs.Open commandtext,db,3,1
Response.Write rs.RecordCount
Response.write "<table>"
Response.Write "<tr>"
for i=0 to rs.Fields.count-1
Response.Write "<td>" & rs.Fields(i).Name & "</td>"
next
Response.Write "</tr>"
do while not rs.EOF
Response.Write "<tr>"
for i=0 to rs.Fields.count-1
Response.Write "<td>"
Response.Write rs(i)
Response.Write "</td>"
next
Response.Write "</tr>"
rs.MoveNext
loop
Response.Write "</table>"
%>
结果为:
dwName gwName count gwlevel
xx公司 生产制造部 环境检测化验A 1 13
xx公司 生产制造部 环境检测化验B 1 13
xx公司 生产制造部 绿化技术管理A 1 39
xx公司 生产制造部 绿化技术管理B 1 39
xx公司 生产制造部 生产调度L 1 35
xx公司 生产制造部 总值班调度D 1 35
xx公司 生产制造部 小计 6 174
xx公司 市场一部 管库 1 14
xx公司 市场一部 清扫 1 9
xx公司 市场一部 售后服务站主任H 1 45
xx公司 市场一部 现场技术诊断D 1 40
xx公司 市场一部 现场技术诊断G 1 37
xx公司 市场一部 小计 5 145
xx公司 资产运营部 能源监察与仲裁 1 39
xx公司 资产运营部 能源外购与外联 1 39
xx公司 资产运营部 巡守员 1 9
xx公司 资产运营部 资产管理A 1 41
xx公司 资产运营部 小计 4 128
xx公司 综合保障部 地变看车点警卫B 1 15
xx公司 综合保障部 东门警卫F-I 4 68
xx公司 综合保障部 后勤服务B 1 9
xx公司 综合保障部 南门警卫G-I 2 34
xx公司 综合保障部 南外门警卫 1 14
xx公司 综合保障部 物资门警卫I 1 18
xx公司 综合保障部 西门警卫H,I 2 36
xx公司 综合保障部 专用线门警卫B-D 3 42
xx公司 综合保障部 小计 15 236
品质保证部 计量处 库房管理 1 15
品质保证部 计量处 小计 1 15
品质保证部 质量管理处 机电配件检验C 1 26
品质保证部 质量管理处 外协件检验B 1 26
品质保证部 质量管理处 质量体系 1 41
品质保证部 质量管理处 小计 3 93
企业管理部 信息中心 应用软件开发J 1 41
企业管理部 信息中心 小计 1 41
研发中心 城轨客车开发部 打字复印C 1 9
研发中心 城轨客车开发部 小计 1 9
研发中心 档案馆 复印工 1 16
研发中心 档案馆 晒图工C-J 1 18
研发中心 档案馆 巡守员B 1 9
研发中心 档案馆 小计 3 43
总计 小计 39 884
如果将上一例子中的rollup改成cube的话,结果会非常复杂。
结果如下:
dwName gwName count gwlevel
xx公司 生产制造部 环境检测化验A 1 13
xx公司 生产制造部 环境检测化验B 1 13
xx公司 生产制造部 绿化技术管理A 1 39
xx公司 生产制造部 绿化技术管理B 1 39
xx公司 生产制造部 生产调度L 1 35
xx公司 生产制造部 总值班调度D 1 35
xx公司 生产制造部 小计 6 174
xx公司 市场一部 管库 1 14
xx公司 市场一部 清扫 1 9
xx公司 市场一部 售后服务站主任H 1 45
xx公司 市场一部 现场技术诊断D 1 40
xx公司 市场一部 现场技术诊断G 1 37
xx公司 市场一部 小计 5 145
xx公司 资产运营部 能源监察与仲裁 1 39
xx公司 资产运营部 能源外购与外联 1 39
xx公司 资产运营部 巡守员 1 9
xx公司 资产运营部 资产管理A 1 41
xx公司 资产运营部 小计 4 128
xx公司 综合保障部 地变看车点警卫B 1 15
xx公司 综合保障部 东门警卫F-I 4 68
xx公司 综合保障部 后勤服务B 1 9
xx公司 综合保障部 南门警卫G-I 2 34
xx公司 综合保障部 南外门警卫 1 14
xx公司 综合保障部 物资门警卫I 1 18
xx公司 综合保障部 西门警卫H,I 2 36
xx公司 综合保障部 专用线门警卫B-D 3 42
xx公司 综合保障部 小计 15 236
品质保证部 计量处 库房管理 1 15
品质保证部 计量处 小计 1 15
品质保证部 质量管理处 机电配件检验C 1 26
品质保证部 质量管理处 外协件检验B 1 26
品质保证部 质量管理处 质量体系 1 41
品质保证部 质量管理处 小计 3 93
企业管理部 信息中心 应用软件开发J 1 41
企业管理部 信息中心 小计 1 41
研发中心 城轨客车开发部 打字复印C 1 9
研发中心 城轨客车开发部 小计 1 9
研发中心 档案馆 复印工 1 16
研发中心 档案馆 晒图工C-J 1 18
研发中心 档案馆 巡守员B 1 9
研发中心 档案馆 小计 3 43
总计 小计 39 884总计 打字复印C 1 9
总计 地变看车点警卫B 1 15
总计 东门警卫F-I 4 68
总计 复印工 1 16
总计 管库 1 14
总计 后勤服务B 1 9
总计 环境检测化验A 1 13
总计 环境检测化验B 1 13
总计 机电配件检验C 1 26
总计 库房管理 1 15
总计 绿化技术管理A 1 39
总计 绿化技术管理B 1 39
总计 南门警卫G-I 2 34
总计 南外门警卫 1 14
总计 能源监察与仲裁 1 39
总计 能源外购与外联 1 39
总计 清扫 1 9
总计 晒图工C-J 1 18
总计 生产调度L 1 35
总计 售后服务站主任H 1 45
总计 外协件检验B 1 26
总计 物资门警卫I 1 18
总计 西门警卫H,I 2 36
总计 现场技术诊断D 1 40
总计 现场技术诊断G 1 37
总计 巡守员 1 9
总计 巡守员B 1 9
总计 应用软件开发J 1 41
总计 质量体系 1 41
总计 专用线门警卫B-D 3 42
总计 资产管理A 1 41
总计 总值班调度D 1 35
可见,用了cube后的结果比原来的多,多出来的正好是后面粉色的部分。正好是正常分组情况下的输出。本例用的两极分组,如果多极的情况下,用了cube,结果会更加复杂。因为它产生的是一个多维数据集。
本文没有对rollup 和 cube的概念和原理进行深入的探讨和分析,只给出一例,以使我们能尽快地得到感性认识。具体应用要根据我们的具体需求,查阅相关资料。