专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »数据库 » sqlserver数据库:使用SQL Server来过滤数据 »正文

sqlserver数据库:使用SQL Server来过滤数据

来源: 发布时间:星期日, 2009年8月16日 浏览:0次 评论:0
  关系型数据通常以规范标准化形式保存就是说你应该尽可能少地重复数据;通常情况下表和表的间仅通过各种键值实现关联步地讲规范标准化含义就是:你不能在数据库中保存计算后而你只能在需要时候临时计算数据库中保存

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

  Northwind数据库中定单

  Northwind数据库是包含在SQL Server安装软件Software中两个示范数据库这个数据库虽然谈不上完美无缺但也足够满足我们讨论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却没有被计算总和或者有其他操作施加于其上

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

  使用GROUP BY

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

  SELECTo.OrderID,Count(od.ProductID)asNumItems
  FROMOrderso,[OrderDetails]od
  WHEREo.OrderID=od.OrderID
  GROUPBYo.OrderID
  ORDERBYNumItemsDESC

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

  理解规则

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


  SELECTc.CompanyName,p.ProductName,Sum(od.Quantity)asTotalBought
  FROMCustomersc,Productsp,Orderso,[OrderDetails]od
  WHERE
  c.CustomerID=o.CustomerIDAND
  o.OrderID=od.OrderIDAND
  od.ProductID=p.ProductID
  GROUPBYc.CompanyName,p.ProductName
  ORDERBYCompanyName,TotalBoughtDESC



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

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


  SELECTo.OrderID,
  Max(od.Quantity)asTopItem,
  Sum(od.Quantity)asTotalBought
  FROM
  Orderso,
  [OrderDetails]od,
  Productsp
  WHERE
  o.OrderID=od.OrderIDAND
  od.ProductID=p.ProductID
  GROUPBYo.OrderID
  ORDERBYTotalBoughtDESC



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

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

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: