用SQL Server Having盘算列和均匀值
做为一名数据库语言和用法教师,我发明一些特别难以说明的主题。其中的一个主题为SQL Server的Having子句。在本文中,我将简略阐明这个子句,并供给一些代码实例,我想这是阐明Having子句用法的最佳方法。
严格来说,Having并不需要一个子表,但没有子表的Having并没有实际意义。假如你只需要一个表,那么你可以用Where子句达到一切目标。为进行实践,Having预先假定至少两个表和一个基于第二个表的合计函数。
下面是一个简略的例子:你想要订单总数超过25000美元的客户清单。你需要适当连接的三个表:Customer、SalesOrderHeader和SalesOrderDetail。然后,你求Detail的和,并将总数与25000美元进行比拟。查看列表A。
查看列表A中的代码时,有一件事情并不明显,即LineTotal列被盘算。你可以像求实际的列的和一样求出已盘算列的和。但是,你不能在同一个把持中履行两个不同层次的合计函数。
以下为引用的内容:
SELECT
Sales.Customer.CustomerID,
Sales.SalesOrderHeader.SalesOrderID,
SUM(Sales.SalesOrderDetail.LineTotal)
AS SubTotalFROM
Sales.Customer
INNER JOIN Sales.SalesOrderHeader
ON Sales.SalesOrderHeader.Customer
ID = Sales.Customer.CustomerID
INNER JOIN Sales.SalesOrderDetail
ON Sales.SalesOrderDetail.SalesOrder
ID = Sales.SalesOrderHeader.SalesOrderIDGROUP BY
Sales.Customer.CustomerID,
Sales.SalesOrderHeader.SalesOrder
IDHAVING SUM(LineTotal) > 25000.00ORDER BY
Sales.Customer.CustomerID,
SalesOrderID ;
列表A
假设你盼看知道所有客户的均匀销售额。你可以应用列表B中的代码,它返回如下错误信息:
以下为引用的内容:
SELECT
Sales.SalesOrderHeader.SalesOrderID,
AVG(SUM(Sales.SalesOrderDetail.LineTotal))
AS AverageFROM
Sales.SalesOrderHeader
INNER JOIN Sales.SalesOrderDetail
ON Sales.SalesOrderDetail.SalesOrder
ID = Sales.SalesOrderHeader.SalesOrder
IDGROUP BY
Sales.SalesOrderHeader.SalesOrderID
列表B
以下为引用的内容:
Msg 130, Level 15, State 1, Line 1
Cannot perform an aggregate function on an expression
containing an aggregate or a subquery.
错误信息
你可以将均匀值的盘算过程进行分解来解决这个标题。你可以将第一部分(SUM)编写成一个表值UDF,如列表C所示。你可以根据列表D中的函数盘算均匀值。列表E阐明你如何能够进行组合。
以下为引用的内容:
USE [AdventureWorks]
GO
/****** Object: UserDefinedFunction
[dbo].[SalesTotals_fnt]
Script Date: 12/09/2006 11:32:54 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[SalesTotals_fnt]()
RETURNS TABLE
AS RETURN
(SELECT SalesOrderID,
SUM(LineTotal)AS TotalSale
FROM Sales.SalesOrderDetail
GROUP BY Sales.SalesOrderDetail.SalesOrderID)
列表C
以下为引用的内容:
CREATE FUNCTION [dbo].[AverageSale_fns] (
-- Add the parameters for the function here
-- )RETURNS money
ASBEGIN
-- Declare the return variable here
DECLARE @Result money
-- Add the T-SQL statements to compute the return value here
SET @Result =(SELECTAvg(TotalSale)AS AverageSale
FROM dbo.SalesTotals_fnt())
-- Return the result of the function
RETURN @Result
END
列表D
以下为引用的内容:
DECLARE @Avg moneySELECT @Avg = dbo.AverageSale_fns()
SELECT *, @Avg as Average,
TotalSale / @Avg as Ratio, CASE
WHEN TotalSale / @Avg > 1 THEN 'Above Average' 用SQL Server Having盘算列和均匀值
-
打酱油 -
震惊 -
呵呵 -
赞 -
鄙视

立即登录 | 注册新用户
最新评论
- 不吐不快,赶紧来一发!
栏目推荐
- 使用SQL Server内存数据库前需要理解的三个问题
- PHP连接 SQLSERVER 注意事项(经典中的经典)
- Php+SqlServer实现分页显示
- Linux下php连接sqlserver的办法
- php SQLserver 导入 Mysql
- PHP模拟SQLServer的两个日期处理函数
- php与sqlserver中文数据为乱码的解决
- Linux下PHP连接MS SQLServer的办法
- 微软为PHP添加SQL Server LocalDb及SQL Server AlwaysOn集群支持
- 远程连接sql server 2000数据库失败解决办法
关注 第一PHP社区 微信公众号

热门点击
- 新闻APP后端系统架构成长之路 - 高可用架构设计
- PHP基础: CLI模式开发不需要任何一种Web服务器
- 基础教程:svn命令在linux下的使用
- 亿级Web系统搭建——单机到分布式集群
- HTTP简介,http是一个属于应用层的面向对象的协议
- Serverless技术架构,传说中的FAAS(Function as a Service),极简运维,无限扩容
- PHP漏洞全解(六)跨网站请求伪造
- php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
- PHP学习路线以及10个PHP优化技巧
- 适用于PHP初学者的学习线路和建议
本站推荐
- 2016PHP技术盛会:如何编写可测试的代码
- MySQL改密码报错:ERROR 1045: Access denied for user: 'root@localhost' (Using password: YES)
- phpmyadmin导入导出数据库文件最大限制的解决方法
- Linux环境下MySQL数据库大小写区分问题
- php 5.4中php-fpm 的重启、终止操作命令
- Key/Value之王Memcached初探:三、Memcached解决Session的分布式存储场景的应用
- Key/Value之王Memcached初探:二、Memcached在.Net中的基本操作
- Key/Value之王Memcached初探:一、掀起Memcached的盖头来
- NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
- NoSQL初探之人人都爱Redis:(3)使用Redis作为消息队列服务场景应用案例
PHP1.CN | 中国最专业的PHP中文社区 | PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | PHP论坛
Copyright © 1998 - 2015 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有
快云为本站提供专业云计算服务
Copyright © 1998 - 2015 PHP1.CN. All Rights Reserved PHP1.CN 第一PHP社区 版权所有
