这是在Microsoft SQL Server 2008 R2中完成的。
我将从一个示例表开始。
Organization | MoneyAmount | MoneyAmountAvg
ISD | 500 |
ISD | 500 |
ISD | 500 |
QWE | 250 |
ISD | 500 |
QWE | 250 |
OLP | 800 |
ISD | 500 |
我需要 MoneyAmountAvg 列的值为MoneyAmount/(# of times that organization shows up
例如, ISD 行的 MoneyAmountAvg 列的值为 100 。
对于 MoneyAmountAvg 列中的每一行,QWE 125 , OLP 的值为 800 ,因为它只有一次。
这只是一个示例表。实际的表格更大,组织更多,但它具有相同的标准。有些组织有多行,而有些组织只有一行。
我只需要一种方法来计算当我为该组织的MoneyAmountAvg列使用更新语句时每个组织列出的次数。对每个组织进行硬编码绝对不是一种选择,因为它们可以随时改变。
感谢任何帮助。
答案 0 :(得分:2)
尝试这样的事情:
;WITH CTE AS
(
SELECT
Org, Moneyamount,
MoneyAvg = AVG(MoneyAmount) OVER(PARTITION BY Org),
OrgCount = COUNT(*) OVER (PARTITION BY Org)
FROM
dbo.YourTableHere
)
SELECT DISTINCT Org, MoneyAmount, OrgCount, MoneyAvg / OrgCount
FROM CTE
这似乎回归了你想要的东西:
答案 1 :(得分:2)
以下是我的回答:
select organization, moneyamount,
moneyamount / count(*) over (partition by organization)
from t
这是一个窗口函数的简单应用。我认为其他大多数答案都是产生整体平均值。
对于更新声明,只需执行:
with toupdate as (
select organization, moneyamount,
moneyamount / count(*) over (partition by organization) as newval
from t
)
update toupdate
set MoneyAmountAvg = newval
答案 2 :(得分:0)
您可以使用分析函数执行此操作:
SELECT Organization,
MoneyAmount,
MoneyAmountAvg = MoneyAmount / COUNT(*) OVER(PARTITION BY Organization)
FROM T
<强> Example on SQL Fiddle 强>
答案 3 :(得分:0)
SELECT (MIN(MoneyAmount) / COUNT(*)) AS AvgMoneyAmount
FROM your_table
GROUP BY Organization
如果单个组织的MoneyAmout始终相等,则此方法有效。
但我会说:重构表格:
Organization | MoneyAmount | count
----------------------------------
ISD | 500 | 5
QWE | 250 | 2
...
答案 4 :(得分:0)
select example.Organization, example.MoneyAmount,
example.MoneyAmount / count(group_table.Organization) as MoneyAmountAvg
from example
inner join example group_table
on example.Organization = group_table.Organization
答案 5 :(得分:0)
select
organization
,avg(MoneyAmount) / count(1)
from tab
group by organization
平均值(金额)的目的是为同一组织处理可能的不同金额值。