亚洲免费乱码视频,日韩 欧美 国产 动漫 一区,97在线观看免费视频播国产,中文字幕亚洲图片

      1. <legend id="ppnor"></legend>

      2. 
        
        <sup id="ppnor"><input id="ppnor"></input></sup>
        <s id="ppnor"></s>

        在sql server數(shù)據(jù)庫中求計算列和平均值

        字號:


            嚴(yán)格來說,having并不需要一個子表,但沒有子表的having并沒有實際意義。如果你只需要一個表,那么你可以用where子句達(dá)到一切目的。為進(jìn)行實踐,having預(yù)先假定至少兩個表和一個基于第二個表的合計函數(shù)。
            下面是一個簡單的例子:你想要訂單總數(shù)超過25000美元的客戶清單。你需要適當(dāng)連接的三個表:customer、salesorderheader和salesorderdetail。然后,你求detail的和,并將總數(shù)與25000美元進(jìn)行比較。查看列表a。
            查看列表a中的代碼時,有一件事情并不明顯,即linetotal列被計算。你可以像求實際的列的和一樣求出已計算列的和。但是,你不能在同一個操作中執(zhí)行兩個不同層次的合計函數(shù)。
            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:
            假設(shè)你希望知道所有客戶的平均銷售額。你可以使用列表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.
            錯誤信息:
            你可以將平均值的計算過程進(jìn)行分解來解決這個問題。你可以將第一部分(sum)編寫成一個表值udf,如列表c所示。你可以根據(jù)列表d中的函數(shù)計算平均值。列表e說明你如何能夠進(jìn)行組合。
            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:
            現(xiàn)在你知道了如何根據(jù)一個子表使用having子句來測試合計值。當(dāng)你需要在一個查詢中使用兩個不同的合計函數(shù)時,最好是把它們分解成單獨的函數(shù),然后再進(jìn)行組合(如前一個例子所說明的)。