SQL Server数据汇总完全解析
SQL Server数据汇总完全解析 |
文章出处:http://www.cnbolgs.com/bonny.wong |
前言: |
在论坛上经常看到有人问“如何实现数据的分类汇总”,很多的人都是介绍这样或那样的控件来实现,而没有从关系数据库语言(SQL)的本身来考虑实现方法。这里,我就借一个实例来说明如何借助SQL自身强大的功能来实现数据的分类汇总。 |
问题的提出: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 乍一看,好像很容易,用group by好像能实现?但仔细研究下去,你又会觉得group by也是无能为力,总欠缺点什么,无从下手。那么,到底该如何做呢?别急,SQL Server早就帮我们做好了,下面,跟我来。 首先,让我们来看一段话: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 看完以上的这段话,悟出了什么没有?如果没有,那么……嘿嘿,你的悟性还不够哟,离“三花棸顶”还早着呢:)。接下来我们再看一段(注意哟,答案马上就揭晓了): ![]() ![]() ![]() ![]() ![]() ![]() 可能看完上面这段你还是觉得“云里雾里”,摸不着头脑。实在不明白也没关系,自己动手做。 首先:建一个上面所说的A表,输入几行数据; 接着:打开你的SQL Server查询分析器,连上包含你上面所建A表的服务器,选择包含该表的数据库; 然后:Copy上面这段SQL 语句,Paste到查询分析器中,按F5,怎么样?看到下面出来了什么?是不是和我下面的一样? ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 咦!奇怪,结果中怎么有那么多“NULL”值?哈,别急,这几行正是我们所要的汇总数据行,不难看出: 01 NULL 13正是对编码为01的所有仓库中的数量的汇总;02 NULL 17是对编码为02的所有仓库的数量的汇总; NULL NULL 30是对所有资料行数量的汇总。 如何?答案出来了吧?是不是很简单呢?当然,上面还有点美中不足,那就是有好多“NULL”的存在。如何去掉这些无意义的NULL呢?下面我们再进行优化。 1、用Grouping替换NULL值 ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]()
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
结束语: 通过上面的讲述,不知道你明白了没有,限于作者的文字表达能力,未解释清楚之处还请见谅。 |
FeedBack:
# re: 用SQL Server实现数据汇总
# re: SQL Server数据汇总完全解析
2005-03-12 10:56 | 寒冰如火
# re: SQL Server数据汇总完全解析
2005-03-12 11:15 | dgqdiy
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
2005-03-12 13:25 | zfphere
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
2005-03-13 08:59 | yyanghhong
对, 我做报表都是用sql来完成大部分事情, 比如结构或layout, 用excel来做点修饰, 比如border, font啥的, 比如master@details
report, 一般reporting tool用两个report band来绑定两个表, 然后把数据倒到client端来做, 实际上这种方法性能很差, 只是实现起来比较方便而已。对一般小数据系统还可以, 大一点的都会出问题。
顺便介绍一下我做的reporting tool, 完全是按照这种思路来做的
http://www.aspose.com/wiki/default.aspx/MyWiki.SqlEditor
http://www.aspose.com/wiki/default.aspx/MyWiki.AsposeReportOverview
report, 一般reporting tool用两个report band来绑定两个表, 然后把数据倒到client端来做, 实际上这种方法性能很差, 只是实现起来比较方便而已。对一般小数据系统还可以, 大一点的都会出问题。
顺便介绍一下我做的reporting tool, 完全是按照这种思路来做的
http://www.aspose.com/wiki/default.aspx/MyWiki.SqlEditor
http://www.aspose.com/wiki/default.aspx/MyWiki.AsposeReportOverview
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
2005-05-09 15:39 | tonghai888@163.com
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
# re: SQL Server数据汇总完全解析
2005-05-16 09:23 | 有点急
我的语句为:
sql= "SELECT CK_NAME as 仓库 , FP_INFO as 发票号,AMOUNT as 数量,oper_date as 日期,MAT_NAME as 物料名称,sum(PLAN_PRICE) as 计划总价 FROM cww where TRANS_NAME='采购入库' and CW_FLAG='2' and OPER_DATE >= '" & date1 & "' and OPER_DATE <= '" & date2 & "' group by CK_NAME,FP_INFO,AMOUNT,oper_date,MAT_NAME with ROLLUP "
我仅仅想对CK_NAME进行汇总,结果对FP_INFO,AMOUNT,oper_date,MAT_NAME 这些也同时进行了分类汇总,弄的我的表乱七八糟
sql= "SELECT CK_NAME as 仓库 , FP_INFO as 发票号,AMOUNT as 数量,oper_date as 日期,MAT_NAME as 物料名称,sum(PLAN_PRICE) as 计划总价 FROM cww where TRANS_NAME='采购入库' and CW_FLAG='2' and OPER_DATE >= '" & date1 & "' and OPER_DATE <= '" & date2 & "' group by CK_NAME,FP_INFO,AMOUNT,oper_date,MAT_NAME with ROLLUP "
我仅仅想对CK_NAME进行汇总,结果对FP_INFO,AMOUNT,oper_date,MAT_NAME 这些也同时进行了分类汇总,弄的我的表乱七八糟
# re: SQL Server数据汇总完全解析
2005-05-16 09:40 | 有点急
仓库 发票号 数量 日期 物料名称 计划总价
文具库 2 4-18 白板笔 45.6
文具库 4-18 纸杯 300
文具库 10 4-18 毛笔 5
文具库 2 4-18 银光笔 5.47
文具库 4066994 12 4-19 派克笔 307.692
663.762
散件库B 111784 1 4-19 柴油粗滤 88.82
散件库B 111784 20 4-19 盖板 369.44
458.26
劳保库 144573 50 4-19 小笤帚 90
劳保库 144574 2 4-19 热水瓶 15.2648
105.2648
我要的是这样的结果,只按照仓库进行价格汇总, 而我上面的程序却对各个列都分别进行价格汇总
文具库 2 4-18 白板笔 45.6
文具库 4-18 纸杯 300
文具库 10 4-18 毛笔 5
文具库 2 4-18 银光笔 5.47
文具库 4066994 12 4-19 派克笔 307.692
663.762
散件库B 111784 1 4-19 柴油粗滤 88.82
散件库B 111784 20 4-19 盖板 369.44
458.26
劳保库 144573 50 4-19 小笤帚 90
劳保库 144574 2 4-19 热水瓶 15.2648
105.2648
我要的是这样的结果,只按照仓库进行价格汇总, 而我上面的程序却对各个列都分别进行价格汇总