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になります。

QWEMoneyAmountAvg列の各行に125を持ち、 OLPは 1 回しか存在しないため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

これはウィンドウ関数の単純なアプリケーションです。他の回答のほとんどは、全体的な平均を生み出していると思います。

update ステートメントの場合は、次のようにします。

 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 に答える