`

实现比较复杂的分组、小计与合计(总结)

阅读更多

实现比较复杂的分组、小计与合计(总结)

求版主加 精华贴~
小菜鸟我来论坛,一个半星期了。今天技术积分终于突破了 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实现小计,合计以及排序

    总结一下,SQL实现小计、合计和排序的关键在于: 1. 使用`GROUP BY`配合聚合函数(如`SUM`)进行小计和合计的计算。 2. 使用`WITH ROLLUP`获取所有级别的合计。 3. 利用`ORDER BY`进行排序,可以结合`GROUPING`函数...

    Extjs 4.2分组小计

    总结,ExtJS 4.2的分组小计功能强大且灵活,能有效地帮助开发者构建具有数据分析功能的Web应用。通过理解并熟练运用上述知识点,你可以根据实际需求构建出满足用户需求的表格展示。在实际项目中,还需要注意数据的...

    Sql Server 分组统计并合计总数及WITH ROLLUP应用

    总结一下,`Sql Server`中的`WITH ROLLUP`操作符是进行分组统计并生成包含小计和总计报表的有效方法。它与`GROUP BY`结合使用,可以方便地生成层次化的总计,帮助用户快速理解数据的分布和总量。通过理解并熟练运用`...

    jasper+ireport化复杂为简单系列教程1

    在报表设计中,“小计”和“合计”是非常常见的需求。通过以下步骤可以实现这些功能: - **新建变量**:在 iReport 中创建一个新的变量。 - **设置计算规则**:指定变量的计算类型,如按组计算。 - **将变量拖到...

    sql rollup用法 小计汇总

    总结来说,SQL ROLLUP是实现多级汇总的强大工具,它可以自动生成各级别的小计和总计,无需编写复杂的嵌套查询。在处理大量数据并需要快速获取不同层次汇总信息时,ROLLUP功能显得非常实用。通过对GROUP BY语句的扩展...

    vxe-table vue table 表格组件功能

    此外,vxe-table还支持表尾合计功能,能够对指定列进行合计操作,输出小计或总计等数据,非常适合财务报表等应用场景。导出CSV功能使得用户可以轻松将表格数据导出到CSV文件中,便于数据的进一步处理或备份。 对于...

Global site tag (gtag.js) - Google Analytics