您好,欢迎来到思海网络,我们将竭诚为您提供优质的服务! 诚征网络推广 | 网站备案 | 帮助中心 | 软件下载 | 购买流程 | 付款方式 | 联系我们 [ 会员登录/注册 ]
促销推广
客服中心
业务咨询
有事点击这里…  531199185
有事点击这里…  61352289
点击这里给我发消息  81721488
有事点击这里…  376585780
有事点击这里…  872642803
有事点击这里…  459248018
有事点击这里…  61352288
有事点击这里…  380791050
技术支持
有事点击这里…  714236853
有事点击这里…  719304487
有事点击这里…  1208894568
有事点击这里…  61352289
在线客服
有事点击这里…  531199185
有事点击这里…  61352288
有事点击这里…  983054746
有事点击这里…  893984210
当前位置:首页 >> 技术文章 >> 文章浏览
技术文章

使用SQL Server过滤数据的方法

添加时间:2014-2-28 17:05:02  添加: 思海网络 

  关系型数据通常以规范化形式保存,就是说你应该尽可能少地重复数据;通常情况下,表与表之间仅通过各种键值实现关联。进一步地讲,规范化的含义就是:你不能在数据库中保存计算后的值,而你只能在需要的时候临时计算数据库中保存的值。

  对数据进行某些分析通常是很重要的。比方说,你或许想知道哪些产品的定单最多或者哪些定单的利润最大。这些问题都要求你针对自己的SQL语句创建执行过滤规则的公式。其中最重要的语句之一就是GROUP BY子句。

  Northwind数据库中的定单

   Northwind数据库是包含在SQL Server安装软件中的两个示范数据库。这个数据库虽然谈不上完美无缺但也足够满足我们讨论GROUP BY语句的目的了。原因之一是它工作原理清晰,运行良好,包含了一整套标准的数据表,比如Customers(客户)、Orders(定单)、Order Details(定单细节)和处理定单的Products(产品)。

  表的结构模式

  如果你想查看各个定单的OrderID和ProductID ,以下的SQL命令可以满足要求:

  SELECT o.OrderID, od.ProductID

  
FROM Orders o, [Order Details] od

  
WHERE o.OrderID = od.OrderID

 

  这样你就通过OrderID字段把Orders和Order Details连接了起来。给出的结果列表即显示各定货条目的OrderID和ProductID。

  你可以从这个列表中找到条目数量最大的定单。可是,再想想,要能简单地要求数据库计算出需要的条目数目不更方便吗?如果你不关心单个条目而只想知道订购条目数量最大的定单,那么你可以采用以下的SQL语句:

  SELECT o.OrderID, Count(od.ProductID) as NumItems

  
FROM Orders o, [Order Details] od

  
WHERE o.OrderID = od.OrderID

 

  这样就可以总计出产品的数量并用一个名为NumItems的新字段来显示总数。可是,如果你执行该语句则可能得到以下错误:

  Server: Msg 8118, Level 16, State 1, Line 1

  选择语句中的'o.OrderID'列是无效的,因为它没有包含在汇集函数之内而且没有相应的GROUP BY 子句。

  在这种情况下,你实际上在总计ProductID,但OrderID却没有被计算总和或者有其他操作施加于其上。

  其实这个示例中计算的并不是订购产品条目的总数而是特定订购产品条目的数目。换句话说,你可以看到某一特定定单包括三种产品,但却并不能表示客户各订购了5种。你得到的正是按照定单统计的产品总量。你应该用GROUP BY字句来查看订购产品的总数。

  使用GROUP BY

   使用GROUP BY就好比提出下面的问题:“我如何查看数据?“如果答案是“按照”某种要素来看那么你就可能用到GROUP BY。就我们的例子来说,你希望按照定单查看产品的数量,所以你就可以用OrderID字段进行分组。此外,采用ORDER BY 子句可以更容易地找出订购条目最多的定单。新的查询语句如下所示:

  SELECT o.OrderID, Count(od.ProductID) as NumItems

  
FROM Orders o, [Order Details] od

  
WHERE o.OrderID = od.OrderID

  
GROUP BY o.OrderID

  
ORDER BY NumItems DESC

 

  现在你就得到问题的答案了。如图B所示的部分结果,定单号11077订购了25种产品,而排第2的最大定单则只订购了6类产品。

  理解规则

   GROUP BY具有相当高的灵活性,当然你还得遵守相应的语法规则。比如说,你可以在ORDER BY 子句中包含多个表列。如果你想查看每一客户订购产品各个类型的数量,那么你必须通过定单创建查询把客户连接到产品。图A显示的4表连接显然就要用到了。之 后你要根据客户和产品进行分组同时对Order Details表内的Quantity列计算总和。查询语句如下:

  SELECT c.CompanyName, p.ProductName, Sum(od.Quantity) as TotalBought

  
FROM Customers c, Products p, Orders o, [Order Details] od

  
WHERE

  c.CustomerID
=o.CustomerID AND

  o.OrderID
=od.OrderID AND

  od.ProductID
=p.ProductID

  
GROUP BY c.CompanyName, p.ProductName

  
ORDER BY CompanyName, TotalBought DESC

 

  查询结果显示出数据库内每一客户购买各类产品的总数。

  同时,你还可以在查询中置入多个汇集列。例如,假设你想查看的定单列表要显示单一项目的最大购买量以及该定单的项目总数,那么以下的语句就可以用Max函数来显示单一项目的最大订购量。这种方法还能对所购项目总量求和。

  SELECT o.OrderID,

  
Max(od.Quantity) as TopItem,

  
Sum(od.Quantity) as TotalBought

  
FROM

  Orders o,

  
[Order Details] od,

  Products p

  
WHERE

  o.OrderID
= od.OrderID AND

  od.ProductID
=p.ProductID

  
GROUP BY o.OrderID

  
ORDER BY TotalBought DESC

 

  现在你得到了定单、订购量排前列的数量以及定单总项。

  GROUP BY是过滤数据的一种强有力的工具。为了在你的SQL表内计算数据,它的功能不可小看。

关键字:SQL Server、数据库

分享到:

顶部 】 【 关闭
版权所有:佛山思海电脑网络有限公司 ©1998-2024 All Rights Reserved.
联系电话:(0757)22630313、22633833
中华人民共和国增值电信业务经营许可证: 粤B1.B2-20030321 备案号:粤B2-20030321-1
网站公安备案编号:44060602000007 交互式栏目专项备案编号:200303DD003  
察察 工商 网安 举报有奖  警警  手机打开网站