3

这是在 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 列使用更新语句时,我只需要一种方法来计算每个组织被列出的次数。为每个组织硬编码绝对不是一种选择,因为它们可以随时更改。

任何帮助表示赞赏。

4

6 回答 6

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

这似乎返回了你正在寻找的东西:

在此处输入图像描述

于 2013-03-01T16:35:43.403 回答
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
于 2013-03-01T16:37:35.880 回答
0

您可以使用分析函数执行此操作:

SELECT  Organization,
        MoneyAmount,
        MoneyAmountAvg = MoneyAmount / COUNT(*) OVER(PARTITION BY Organization)
FROM    T

SQL Fiddle 示例

于 2013-03-01T16:35:39.477 回答
0
SELECT (MIN(MoneyAmount) / COUNT(*)) AS AvgMoneyAmount
FROM your_table
GROUP BY Organization

如果单个组织的 MoneyAmout 始终相等,则此方法有效。


但我会说:重构表:

Organization | MoneyAmount | count
----------------------------------
ISD          | 500         | 5
QWE          | 250         | 2
... 
于 2013-03-01T16:35:47.460 回答
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
于 2013-03-01T16:37:48.237 回答
0
select
    organization
    ,avg(MoneyAmount) / count(1) 
  from tab
  group by organization

avg(Moneyamount)的目的是为同一组织处理可能的不同金额值。

于 2013-03-01T16:39:18.320 回答