All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
ASP.NET,2.0,中实现跨页提交_[Asp.Net教程]
在ASP.NET中把图片保存到SQL,SERVER数据库(vb.net)_[Asp.Net教程]
在asp.net2.0页面部分缓存中实现缓存后替换文字内
SQL,Server,CLR全功略之二---CLR存储过程_mssql学习_编程技术
ASP.NET,2.0打造购物车和支付系统之二_[Asp.Net教程]
PHP和MYSQL制作动态网站开发经验之谈_php资料_编程技术
HTML中小meta的大作用_[Html教程]
HTML 5 预览(2)_[Html教程]
一些很实用且必用的小脚本代码_JavaScript技术_编程技术
ASP.NET,2.0高级数据处理之主从数据表_.net资料_编程技术
Reading number is top 10 pictures
美女当网吧管理员的悲剧
Chinese paper-cut grilles art appreciation7
Startling Russian girl blind date scene3
Sora aoi on twitter1
Beauty is thus produced
Startling Russian girl blind date scene1
So beauty, will let you spray blood8
恶搞漫画2
Most cow mistress ZhaoGongXia face exposure
漂亮脸蛋魔鬼身材2
Download software ranking
美女游泳记
Kung.Fu.Panda.2
The hero
虚拟机5.5.3版
The king of fighters 97(Mobile phone games-apk)
Tram sex maniac 2 (H) rar bag14
Unix video tutorial17
Boxer's Top ten classic battle4
电脑知识及技巧大合集
Ashlynn Video3
归海一刀 published in(发表于) 2014/2/3 6:37:47 Edit(编辑)
SQL Server数据汇总完全解析_[SQL Server教程]

SQL Server数据汇总完全解析_[SQL Server教程]

SQL Server数据汇总完全解析_[SQL Server教程]

前言:


在论坛上经常看到有人问“如何实现数据的分类汇总”,很多的人都是介绍这样或那样的控件来实现,而没有从关系数据库语言(SQL)的本身来考虑实现方法。这里,我就借一个实例来说明如何借助SQL自身强大的功能来实现数据的分类汇总。


问题的提出:


现有表A,内容如下:


编码
仓库
数量
01
A
6
01
B
7
02
A
8
02
B
9


现在想按编码查询出这种格式:


编码
仓库
数量
01
A
6
01
B
7
汇总小计:
13
02
A
8
02
B
9
汇总小计:
17


问:该如何实现?


乍一看,好像很容易,用group by好像能实现?但仔细研究下去,你又会觉得group by也是无能为力,总欠缺点什么,无从下手。那么,到底该如何做呢?别急,SQL Server早就帮我们做好了,下面,跟我来。


首先,让我们来看一段话:


在生成包含小计和合计的报表时,ROLLUP 运算符很有用。ROLLUP 运算符生成的结果集类似于 CUBE 运算符所生成的结果集。


CUBE 运算符生成的结果集是多维数据集。多维数据集是事实数据的扩展,事实数据即记录个别事件的数据。扩展建立在用户打算分析的列上。这些列被称为维。多维数据集是一个结果集,其中包含了各维度的所有可能组合的交叉表格。


CUBE 运算符在 SELECT 语句的 GROUP BY 子句中指定。该语句的选择列表应包含维度列和聚合函数表达式。GROUP BY 应指定维度列和关键字 WITH CUBE。结果集将包含维度列中各值的所有可能组合,以及与这些维度值组合相匹配的基础行中的聚合值。


CUBE 和 ROLLUP 之间的区别在于: CUBE 生成的结果集显示了所选列中值的所有组合的聚合;ROLLUP 生成的结果集显示了所选列中值的某一层次结构的聚合。


看完以上的这段话,悟出了什么没有?如果没有,那么……嘿嘿,你的悟性还不够哟,离“三花棸顶”还早着呢:)。接下来我们再看一段(注意哟,答案马上就揭晓了):



SELECT 编码, 仓库, Sum(数量) as 数量
FROM A
GROUP BY 编码, 仓库 WITH ROLLUP
--关键就是后面的WITH ROLLUP
--当然,你也可以用WITH CUBE,但是结果会有点不大一样



可能看完上面这段你还是觉得“云里雾里”,摸不着头脑。实在不明白也没关系,自己动手做。


首先:建一个上面所说的A表,输入几行数据;接着:打开你的SQL Server查询分析器,连上包含你上面所建A表的服务器,选择包含该表的数据库;然后:Copy上面这段SQL 语句,Paste到查询分析器中,按F5,怎么样?看到下面出来了什么?是不是和我下面的一样?


编码
仓库
数量
01
A
6
01
B
7
01
NULL
13
02
A
8
02
B
9
02
NULL
17
NULL
NULL
30


如果你用的是WITH CUBE,结果集的后面还会多出两条(如果你也只是输入示例中的几行数据的话): NULL A 14

NULL B 16


咦!奇怪,结果中怎么有那么多“NULL”值?哈,别急,这几行正是我们所要的汇总数据行,不难看出:


01 NULL 13正是对编码为01的所有仓库中的数量的汇总;02 NULL 17是对编码为02的所有仓库的数量的汇总;

NULL NULL 30是对所有资料行数量的汇总。


如何?答案出来了吧?是不是很简单呢?当然,上面还有点美中不足,那就是有好多“NULL”的存在。如何去掉这些无意义的NULL呢?下面我们再进行优化。


1、用Grouping替换NULL值



SELECT CASE WHEN (GROUPING(编码) = 1) THEN 'ALL'
ELSE ISNULL(编码, 'UNKNOWN')
END AS 编码,
CASE WHEN (GROUPING(仓库) = 1) THEN 'ALL'
ELSE ISNULL(仓库, 'UNKNOWN')
END AS 仓库,
SUM(数量) AS 数量
FROM A
GROUP BY 编码, 仓库 WITH ROLLUP
--适当的运用Case函数



结果我这里就不写了,就是把上面的“NULL”值全部换成“ALL”字符串


2、利用程序做进一步的优化



//通常为了显示上的需要,我们必须对以上SQL语句生成的结果做一些优化,下面给出自然语言描述: 
WHILE(未到达最后一条记录){
  IF 编码值不为ALL而仓库值为ALL
  {
     将编码值用“小计:”替换,将仓库值用""替换;
     将这一行的颜色标示为灰色;
  }
  ELSE 编码值为ALL仓库值也为ALL
  {
     将编码值用“总计:”替换,将仓库值用""替换;
     将这一行的着色标示为淡绿色;
  }
  指针移到下一条;
}
//当然,你尽可以发挥你的想象,把表格打扮得漂漂亮亮的,我就不再罗嗦了。



结束语:


通过上面的讲述,不知道你明白了没有,限于作者的文字表达能力,未解释清楚之处还请见谅。


来源:网络







添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.