求版主加 精华贴~
小菜鸟我来论坛,一个半星期了。今天技术积分终于突破了 200分。
感谢
dingjun123 以及
各位大侠对我的无私帮助。我也要帮助下新人,特别总结下聚合函数over,与分组函数group by rollup
内容可能对高手来说是个笑话,但orlace的知识不是笑话
我援引的帖子是----> 如何实现比较复杂的分组、小计与合计
http://www.itpub.net/viewthread. ... p;extra=&page=1这是2008年的一个老帖。在dingjun123和各位大侠的帮助下。我终于明白了很多。
下面分享下我的学习成果(
基础代码在二楼贴出)
首先纠正下我原来对over的一个误解。我总觉得,rank(),row_number(),dense_rank() 这些都是跟over一起用的。
其实这导致了我后来走入了一个很大的误区。其实 sum(),avg()还有其他函数,都是可以写在over前面的;如
SELECT STOCK_ID,QTY,
SUM(QTY) OVER(PARTITION BY STOCK_ID),
AVG(QTY) OVER(PARTITION BY STOCK_ID) FROM T_DIST;
这个函数的真正作用是根据STOCK_ID进行分组求和(sum),或者求平均数(avg)。独立作为一列,加在最后。
注意,这里没有group 函数 哦~GROUP BY ROLLUP 函数大家都懂。
SELECT STOCK_ID,TYPE_CD,DISCOUNT,SUM(QTY) FROM T_DIST GROUP BY ROLLUP(STOCK_ID,(TYPE_CD,DISCOUNT));
根据STOCK_ID,(TYPE_CD,DISCOUNT)分组。括号内的表示捆绑,你懂的哦。
--学习是一步一步来的。
--1,
select stock_Id,TYPE_CD,DISCOUNT,QTY from t_dist;
--2,聚合函数,over,‘行’分组求和
SELECT STOCK_ID,QTY,SUM(QTY) OVER(PARTITION BY STOCK_ID) FROM T_DIST;
--(最后多一列,上面提及了)
--3,group,‘列’分组求和
SELECT STOCK_ID,TYPE_CD,DISCOUNT,SUM(QTY) FROM T_DIST GROUP BY ROLLUP(STOCK_ID,(TYPE_CD,DISCOUNT));
--(由于是分组统计多了4行合计)
--现在在3的基础上+ b1,b2,b3(看步骤2)
SELECT STOCK_ID,
TYPE_CD B1,
DISCOUNT B2,
SUM(QTY) B3,
SUM(
TYPE_CD) OVER(PARTITION BY STOCK_ID) A1,
SUM(
DISCOUNT) OVER(PARTITION BY STOCK_ID) A2,
SUM(
SUM(QTY)) OVER(PARTITION BY STOCK_ID) A3
FROM T_DIST GROUP BY ROLLUP(STOCK_ID,(TYPE_CD,DISCOUNT));
--我们可以发现 b1和b2(
蓝色),b3 (
紫色)本来就是同级别的。 a1,a2,a3只不过对b1,b2,b3求了和而已;
--继续增加2列吧
SELECT STOCK_ID,
TYPE_CD B1,DISCOUNT B2,SUM(QTY) B3,
SUM(TYPE_CD) OVER(PARTITION BY STOCK_ID) A1,
SUM(DISCOUNT) OVER(PARTITION BY STOCK_ID) A2,
SUM(SUM(QTY)) OVER(PARTITION BY STOCK_ID) A3,
grouping(STOCK_ID) k1,
grouping(TYPE_CD) k2,grouping(DISCOUNT) k3, FROM T_DIST GROUP BY ROLLUP(STOCK_ID,(TYPE_CD,DISCOUNT));
/*这里增加的k1是最后的分组(STOCK_ID在前),
k2,k3是同级,因为在gollup中,绑定了 TYPE_CD和DISCOUNT*/
好了,最后的大戏来了。我到底发现了什么呢???
就是rollup与over步骤先后顺序,先走的 rollup,然后是 over。
证据是什么呢?因为rollup 之后才会有grouping(xx),而且在over函数中还可以使用;
看终结部分,再增加2列(经原来a3改造过成p3)
SELECT STOCK_ID,
TYPE_CD B1,DISCOUNT B2,SUM(QTY) B3,
SUM(TYPE_CD) OVER(PARTITION BY STOCK_ID) A1,
SUM(DISCOUNT) OVER(PARTITION BY STOCK_ID) A2,
SUM(SUM(QTY)) OVER(PARTITION BY STOCK_ID) A3,
SUM(SUM(QTY)) OVER(PARTITION BY STOCK_ID,(GROUPING(TYPE_CD))) P3,GROUPING(STOCK_ID) K1, --
GROUPING(TYPE_CD) K2,GROUPING(DISCOUNT) K3 --
FROM T_DIST GROUP BY ROLLUP(STOCK_ID,(TYPE_CD,DISCOUNT));
注意到A3和p3的区别没。
这partition分组用的grouping(type_cd),其实是GROUP BY ROLLUP之后产生的。
因此这里的over分组,其实还用了之前的产生的grouping(type_cd)。
相关推荐
客户提出需求,针对某一列分组加上小计,合计汇总。网上找了一些有关SQL加合计的语句。都不是很理想。决定自己动手写。思路有三个:1.很多用GROUPPING和ROLLUP来实现。 优点:实现代码简洁,要求对GROUPPING和...
本篇文章是对SQL实现小计,合计以及排序进行了详细的分析介绍,需要的朋友参考下
使用ROLLUP函数生成报表的小计、合计 这个函数很不错 使用的范围其实蛮广的
Extjs 4.2分组小计
Oracle关于分组小计再合计-附件资源
U8自定义报表使用存储过程时,使用系统的分组和小计、累计、合计
第三方控件Dev Gridcontrol 分组合计 用代码方式实现的 比较简单 适合新手
用友U8自定义报表使用存储过程时,使用系统的分组和小计、累计、合计
文章目录小计、合计与总计多维度交叉统计自定义统计维度数据透视表总结 学习过 SQL 的人都知道,使用聚合函数(AVG、SUM、COUNT、MIN/MAX 等)和分组操作(GROUP BY)可以对数据进行基本的统计分析,例如统计公司...
datagridview的动态表头 合计 分组 分合计 东西还是比较好的
DataGridVIew分组+合计+筛选
利用jquery的插件jqgrid实现表头合并、分组、合计、例子
依靠gridcontrol强大的属性功能实现分组,并依据分组总计,平均统计等。本实例根据班级分组计算班级总分与平均分。
C#实现DataGridView二维表头与合计栏,最简单的代码,实现二维表头
DataGrid 统计每一列的值,合计在底部。 这里的合计是在 DataGrid 的内部,汇总在最后一行,在 DataGrid 横向滚动条的上方进行汇总。
打印模板小计合计配置.pdf
1、效果图 2、后台返回数据格式(平铺式) 3、后台返回数据后,整理所需要展示的属性存储到(items)数组内 var obj = { id: curItems[i].id, feeName: curItems[i].feeName, projectName: curItems[i]....
DATAGRIDVIEW实现双表头及合计栏