【问题标题】:Get Total Average of Column in One Row SQL获取一行 SQL 中列的总平均值
【发布时间】:2015-05-28 19:22:19
【问题描述】:

我是一家保险公司的实习生,我被分配计算 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

所以我的表是这样的:

卡斯特诺 |客户 ID |客户 |进入日期 |更改日期 |高级 |总溢价

xxxxxx | xxxxxx | xxxxxx | xxxxxxxxxxx | xxxxxxxxxxx | 1350.38 | 1350.38

xxxxxx | xxxxxx | xxxxxx | xxxxxxxxxxx | xxxxxxxxxxx | 3517.00 | 2433.69

xxxxxx | xxxxxx | xxxxxx | xxxxxxxxxxx | xxxxxxxxxxx | 2094.00 | 2320.46

xxxxxx | xxxxxx | xxxxxx | xxxxxxxxxxx | xxxxxxxxxxx | 1811.00 | 2193.09

等等

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

总保费

2193.09

如果您有任何问题,请发表评论。我尽我所能诚实地尽力解释它......

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

感谢您的帮助!

【问题讨论】:

  • 所以最后一个custno TotalPremium(即2193.09)就是你所需要的。因为它是从第一个 custno
  • 2193.09 不是这 4 个的平均值...那么您要的是什么?还是您的示例有缺陷? 2074.405 是……这 4 个的平均值……
  • 是的。我加 1350.38 + 3517.00 + 2094.00 + 1811.00 = 2193.09

标签: sql average sql-server-2014


【解决方案1】:

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

SELECT AVG(Premium)
FROM 
( 

  <your query>

) as MyQuery

【讨论】:

  • 将 sum 替换为 Avg,你可能会得到它。
  • 我将查询更改为您所说的,但我得到的不是原始查询 (1558.1748) 的最终结果,而是 1581.139。 (值相差 23)。
  • 你的电话号码是从哪里来的?可能有舍入错误或没有考虑尾随数字。
  • 我只给出了实际查询的前 4 行。我总共有 7759 行。因此平均有 7759 名客户和 7759 次保费。
  • 我认为这里第一行需要SELECT AVG(Premium)TotalPremium 看起来像是一个运行平均值,所以理论上最后一行将是最终平均值。因此,您实际上是在平均运行平均值。他可能只是摆脱了TotalPremium 列。
【解决方案2】:

做同一件事的不同方式...

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

【讨论】:

    猜你喜欢
    • 2021-10-25
    • 2015-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多