在sql server数据库中求计算列和平均值
来源: 阅读:809 次 日期:2014-11-17 14:29:37
温馨提示: 小编为您整理了“在sql server数据库中求计算列和平均值”,方便广大网友查阅!

严格来说,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'

when totalsale / @avg < 1 then 'below average'

else 'average' end

from dbo.salestotals_fnt()

列表e:

现在你知道了如何根据一个子表使用having子句来测试合计值。当你需要在一个查询中使用两个不同的合计函数时,最好是把它们分解成单独的函数,然后再进行组合(如前一个例子所说明的)。

更多信息请查看IT技术专栏

更多信息请查看数据库
由于各方面情况的不断调整与变化, 提供的所有考试信息和咨询回复仅供参考,敬请考生以权威部门公布的正式信息和咨询为准!
关于我们 | 联系我们 | 人才招聘 | 网站声明 | 网站帮助 | 非正式的简要咨询 | 简要咨询须知 | 加入群交流 | 手机站点 | 投诉建议
工业和信息化部备案号:滇ICP备2023014141号-1 云南省教育厅备案号:云教ICP备0901021 滇公网安备53010202001879号 人力资源服务许可证:(云)人服证字(2023)第0102001523号
云南网警备案专用图标
联系电话:0871-65317125(9:00—18:00) 获取招聘考试信息及咨询关注公众号:
咨询QQ:526150442(9:00—18:00)版权所有:
云南网警报警专用图标
Baidu
map