网站首页  汉语字词  英语词汇  考试资料  写作素材  旧版资料

请输入您要查询的范文:

 

标题 在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子句来测试合计值。当你需要在一个查询中使用两个不同的合计函数时,最好是把它们分解成单独的函数,然后再进行组合(如前一个例子所说明的)。
随便看

 

在线学习网范文大全提供好词好句、学习总结、工作总结、演讲稿等写作素材及范文模板,是学习及工作的有利工具。

 

Copyright © 2002-2024 cuapp.net All Rights Reserved
更新时间:2025/5/20 17:12:45