SQL Server数据库的数据汇总完全解析

低头哈腰的人生

低头哈腰的人生

2016-02-19 21:18

下面是个SQL Server数据库的数据汇总完全解析教程,撑握了其技术要点,学起来就简单多了。赶紧跟着图老师小编一起来看看吧!

  前言:

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

  在论坛上经常看到有人问“如何实现数据的分类汇总”,很多的人都是介绍这样或那样的控件来实现,而没有从关系数据库语言(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 生成的结果集显示了所选列中值的某一层次结构的聚合。

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

(本文来源于图老师网站,更多请访问https://m.tulaoshi.com/bianchengyuyan/)

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
  {
     将编码值用“总计:”替换,将仓库值用""替换;
     将这一行的着色标示为淡绿色;
  }
  指针移到下一条;
}

  //当然,你尽可以发挥你的想象,把表格打扮得漂漂亮亮的,我就不再罗嗦了。

  结束语:

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

展开更多 50%)
分享

猜你喜欢

SQL Server数据库的数据汇总完全解析

编程语言 网络编程
SQL Server数据库的数据汇总完全解析

SQL Server数据汇总完全解析

SQLServer
SQL Server数据汇总完全解析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

SQL Server数据库检修

SQLServer
SQL Server数据库检修

SQL Server数据库导入MySQL数据库体验

MySQL mysql数据库
SQL Server数据库导入MySQL数据库体验

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

谈谈数据从sql server数据库导入mysql数据库的体验

MySQL mysql数据库
谈谈数据从sql server数据库导入mysql数据库的体验

从SQL server数据库导入Mysql数据库的体验

MySQL mysql数据库
从SQL server数据库导入Mysql数据库的体验

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

褪色旳爱情伤感分组_黑夜渲染了最后的希望

褪色旳爱情伤感分组_黑夜渲染了最后的希望

SQL Server与Oracle、DB2三种数据库比较

SQL Server与Oracle、DB2三种数据库比较
下拉加载更多内容 ↓