获取一行SQL中列的总平均值
我是一家保险公司的实习生,被指派计算x个客户的保费平均值 我正在使用SQL Server 2014 以下是我的疑问:获取一行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
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专栏。