您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

在SQL Server数据库中求计算列和平均值

2024/2/27 3:00:01发布18次查看
严格来说,having并不需要一个子表,但没有子表的having并没有实际意义。如果你只需要一个表,那么你可以用where子句达到一切目的。为进行实践,having预先假定至少两个表和一个基于第二个表的合计函数。 下面是一个简单的例子:你想要订单总数超过25000美元
严格来说,having并不需要一个子表,但没有子表的having并没有实际意义。如果你只需要一个表,那么你可以用where子句达到一切目的。为进行实践,having预先假定至少两个表和一个基于第二个表的合计函数。
下面是一个简单的例子:你想要订单总数超过25000美元的客户清单。你需要适当连接的三个表:customer、salesorderheader和salesorderdetail。然后,你求detail的和,并将总数与25000美元进行比较。查看列表a。
查看列表a中的代码时,有一件事情并不明显,即linetotal列被计算。你可以像求实际的列的和一样求出已计算列的和。但是,你不能在同一个操作中执行两个不同层次的合计函数。
selectsales.customer.customerid,sales.salesorderheader.salesorderid,sum(sales.salesorderdetail.linetotal) as subtotalfromsales.customerinner join sales.salesorderheaderon sales.salesorderheader.customerid = sales.customer.customeridinner join sales.salesorderdetailon sales.salesorderdetail.salesorderid = sales.salesorderheader.salesorderidgroup bysales.customer.customerid,sales.salesorderheader.salesorderidhaving sum(linetotal) > 25000.00order bysales.customer.customerid,salesorderid ;列表a:
假设你希望知道所有客户的平均销售额。你可以使用列表b中的代码,它返回如下错误信息:
selectsales.salesorderheader.salesorderid,avg(sum(sales.salesorderdetail.linetotal)) as averagefromsales.salesorderheaderinner join sales.salesorderdetailon sales.salesorderdetail.salesorderid = sales.salesorderheader.salesorderidgroup bysales.salesorderheader.salesorderid列表b:
msg 130, level 15, state 1, line 1cannot 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 ongoset quoted_identifier ongocreate function [dbo].[salestotals_fnt]()returns tableas return(select salesorderid, sum(linetotal)as totalsalefrom sales.salesorderdetailgroup by sales.salesorderdetail.salesorderid)列表c:
create function [dbo].[averagesale_fns] (-- add the parameters for the function here-- )returns moneyasbegin-- declare the return variable heredeclare @result money-- add the t-sql statements to compute the return value hereset @result =(selectavg(totalsale)as averagesalefrom dbo.salestotals_fnt())-- return the result of the functionreturn @resultend列表d:
declare @avg moneyselect @avg = dbo.averagesale_fns()select*, @avg as average,totalsale / @avg as ratio,casewhen totalsale / @avg > 1 then 'above average'when totalsale / @avg 列表e:现在你知道了如何根据一个子表使用having子句来测试合计值。当你需要在一个查询中使用两个不同的合计函数时,,最好是把它们分解成单独的函数,然后再进行组合(如前一个例子所说明的)。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product