具有唯一值的SQL Server COUNT查询

时间:2013-03-01 16:30:30

标签: sql join count sql-server-2008-r2

这是在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列使用更新语句时每个组织列出的次数。对每个组织进行硬编码绝对不是一种选择,因为它们可以随时改变。

感谢任何帮助。

6 个答案:

答案 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

这似乎回归了你想要的东西:

enter image description here

答案 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

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