2013-03-01 64 views
3

这是在Microsoft SQL Server 2008 R2中完成的。具有唯一值的SQL Server COUNT查询

我将用一个例子表开始了。

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行将有的值。

QWE将有在MoneyAmountAvg柱和OLP每排将有一个值,因为它的存在只有一次。

这仅是一个示例表。实际的表格要大得多,并且有更多的组织,但它具有相同的标准。一些组织有多行,而其他组织只有一次。

我只需要它来计算多少次,当我使用的更新语句该组织的MoneyAmountAvg列各机构列出了一个办法。对每个组织进行硬编码绝对不是一种选择,因为它们可以在任何时候改变。

任何帮助表示赞赏。

回答

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 
+0

但是,SELECT语句有效,我需要这个来使用UPDATE语句。我知道你必须使用CTE,但我遇到了一些麻烦。 – Mo2 2013-03-05 20:28:05

+0

欣赏帮助。最后一个问题。我在那里有另一个名为LoadDt的列,它基本上反映了插入行的日期。我希望它只更新实际的表,其中:'LoadDt =(SELECT MAX(LoadDt)From [TableName])' 当我在FROM语句之后或SET语句之后添加where子句时,它会告诉我203行受到影响,但所有具有最新LoadDt的行仍不受影响。 – Mo2 2013-03-05 21:09:53

+0

NVM,算出来。您忘记在您的UPDATE语句中的SELECT语句中选择MoneyAmountAvg列,并且意外更新了MoneyAmount列而不注意。 – Mo2 2013-03-05 21:18:09

0

为此,您可以使用分析功能:

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

Example on SQL Fiddle

+0

问题不是整体平均值,只是列中的值除以次数。 – 2013-03-01 16:36:51

+0

@GordonLinoff谢谢,正在进行更改,因为您评论过看到SQL小提琴给出了错误的结果。 – GarethD 2013-03-01 16:40:45

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

0
SELECT (MIN(MoneyAmount)/COUNT(*)) AS AvgMoneyAmount 
FROM your_table 
GROUP BY Organization 

这适用于单个组织的MoneyAmout总是相等的情况。


但我要说:重构表:

Organization | MoneyAmount | count 
---------------------------------- 
ISD   | 500   | 5 
QWE   | 250   | 2 
... 
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 
0
select 
    organization 
    ,avg(MoneyAmount)/count(1) 
    from tab 
    group by organization 

AVG(Moneyamount)是处理量的不同可能值,同一组织的purpouse。