获取一行SQL中列的总平均值

获取一行SQL中列的总平均值,sql,average,sql-server-2014,Sql,Average,Sql Server 2014,我是一家保险公司的实习生,被指派计算x个客户的保费平均值 我正在使用SQL Server 2014 以下是我的疑问: SELECT Customer.custno , Customer.custid , (Customer.firstname + ' ' + Customer.lastname) AS Client , BasicPolInfo.enteredDate , BasicPolInfo.changedDate , Basic

我是一家保险公司的实习生,被指派计算x个客户的保费平均值

我正在使用SQL Server 2014

以下是我的疑问:

SELECT  

    Customer.custno 
    , Customer.custid 
    , (Customer.firstname + ' ' + Customer.lastname) AS Client 
    , BasicPolInfo.enteredDate
    , BasicPolInfo.changedDate
    , BasicPolInfo.fulltermpremium AS Premium
    , AVG(BasicPolInfo.fulltermpremium) over(ORDER BY Customer.custno 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 'Total Premium'

FROM 
    
    Customer INNER JOIN
    BasicPolInfo ON Customer.CustId = BasicPolInfo.CustId INNER JOIN
    Transaction ON BasicPolInfo.PolId = Transaction.PolId INNER JOIN
    GeneralLedgerBranch ON Customer.GLBrnchCode = GeneralLedgerBranch.GLBrnchCode INNER JOIN
    GeneralLedgerDepartment ON Customer.GLDeptCode = GeneralLedgerDepartment.GLDeptCode INNER JOIN
    GeneralLedgerDivision ON Customer.GLDivCode = GeneralLedgerDivision.GLDivCode INNER JOIN
    Employee ON BasicPolInfo.ExecCode = Employee.EmpCode

WHERE   

    Customer.Active = 'Y'  
    AND BasicPolInfo.poltypelob = 'Homeowners'
    AND BasicPolInfo.status <> 'D'
    AND BasicPolInfo.fulltermpremium > '0.00'
    AND BasicPolInfo.polexpdate >= GetDate()


GROUP BY 
    
Customer.custno 
    , Customer.custid
    , Customer.firstname 
    , Customer.lastname 
    , BasicPolInfo.ChangedDate
    , BasicPolInfo.entereddate
    , Employee.firstname
    , Employee.lastname
    , Customer.enteredDate
    , basicpolinfo.fulltermpremium

ORDER BY 

    Customer.enteredDate ASC
所以我的桌子看起来像这样:

Custno | CustID | Client | EnteredDate | ChangedDate | Premium | TotalPremium

xxxxxx | xxxxxx | xxxxxx | XXXXXXXXXX | XXXXXXXXXX | 1350.38 | 1350.38

xxxxxx | xxxxxx | xxxxxx | XXXXXXXXXX | XXXXXXXXXX | 3517.00 | 2433.69

xxxxxx | xxxxxx | xxxxxx | XXXXXXXXXX | XXXXXXXXXX | 2094.00 | 2320.46

xxxxxx | xxxxxx | xxxxxx | XXXXXXXXXX | XXXXXXXXXX | 1811.00 | 2193.09

等等

所以我老板想要的只是平均值的一列。例如,如果这只有4个客户,那么它将只显示2193.09,包括之前的所有计算,而不显示数千行

总保险费

2193.09

如果您有任何问题,请发表评论。我尽我最大的努力诚实地解释它,我可以最好的方式

我们试图以图形方式仅表示1总保费平均值


谢谢你的帮助

如果我正确理解了这个问题,您只需将整个查询包装成:

SELECT AVG(Premium)
FROM 
( 

  <your query>

) as MyQuery

做同一件事的不同方式

With CTE AS (SELECT  
    Customer.custno 
    , Customer.custid 
    , (Customer.firstname + ' ' + Customer.lastname) AS Client 
    , BasicPolInfo.enteredDate
    , BasicPolInfo.changedDate
    , BasicPolInfo.fulltermpremium AS Premium
    , AVG(BasicPolInfo.fulltermpremium) over(ORDER BY Customer.custno 
    ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS 'Total Premium'

FROM 

    Customer INNER JOIN
    BasicPolInfo ON Customer.CustId = BasicPolInfo.CustId INNER JOIN
    Transaction ON BasicPolInfo.PolId = Transaction.PolId INNER JOIN
    GeneralLedgerBranch ON Customer.GLBrnchCode = GeneralLedgerBranch.GLBrnchCode INNER JOIN
    GeneralLedgerDepartment ON Customer.GLDeptCode = GeneralLedgerDepartment.GLDeptCode INNER JOIN
    GeneralLedgerDivision ON Customer.GLDivCode = GeneralLedgerDivision.GLDivCode INNER JOIN
    Employee ON BasicPolInfo.ExecCode = Employee.EmpCode

WHERE   

    Customer.Active = 'Y'  
    AND BasicPolInfo.poltypelob = 'Homeowners'
    AND BasicPolInfo.status <> 'D'
    AND BasicPolInfo.fulltermpremium > '0.00'
    AND BasicPolInfo.polexpdate >= GetDate()


GROUP BY 

Customer.custno 
    , Customer.custid
    , Customer.firstname 
    , Customer.lastname 
    , BasicPolInfo.ChangedDate
    , BasicPolInfo.entereddate
    , Employee.firstname
    , Employee.lastname
    , Customer.enteredDate
    , basicpolinfo.fulltermpremium

ORDER BY 

    Customer.enteredDate ASC)

SELECT AVG(fulltermpremium) from cte

因此,您需要的是最后一款custno TotalPremiumie 2193.09。因为它是从第一个客户计算出来的2193.09不是这4个客户的平均值。。。那你要找的是什么?还是你的例子有缺陷?2074.405是。。。这4个人的平均数……是的。我加上1350.38+3517.00+2094.00+1811.00=2193.09将总和替换为平均值,你可能会得到它。我将我的查询改为你所说的,但我得到的不是原始查询1558.1748的最终结果,而是1581.139。值被减了23。你的号码是从哪里来的?一个可能有舍入错误,或者没有考虑尾随数字。我只给出了实际查询的前4行。总共有7759行。因此,平均7759个客户和7759个保费。我认为需要的是在这里的第一行选择AVGPremium。TotalPremium看起来像一个运行平均值,因此理论上最后一行将是最终平均值。所以你实际上是在平均跑步。他或许可以摆脱TotalPremium专栏。