2013-03-01 61 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。