2011-03-09 8 views
3

ためave_cost更新するI持っている(行ごとに)そのレコードの平均コストとそれが中だしたカテゴリの平均コストを持っている必要があり、このテーブル。SQLクエリは、全体のカテゴリ欄

id  category cost  num ave_cost ave_cost_category 
15117012 15 357.00  420  0.85   0.85 
79030402 79 365.00  349  1.04   1.04 
90125402 90 351.20  439  0.80   0.828 
90125146 90 105.00  112  0.9375  0.828 

ave_cost_categoryは、計算が必要な列です(現在nullです)。私はテーブルにave_costデータを持っています。

+1

あなたの質問は何ですか?投稿したサンプルデータには、ave_costとave_cost_categoryがあります。 –

+3

cat 90の場合、平均は(351.20 + 105.00)/(439 + 112)= 0.828? –

+0

@ken - ave_cost_categoryは現在nullです。それは私が手動で計算したデータの一例です。 @marc - そうです、私の間違いです。 – James

答えて

1

あなたは、カテゴリごとの平均コストを計算し、そこからあなたのテーブルを更新するために、CTE(共通テーブル式)を使用することができます

;WITH CatCost AS 
(
    SELECT 
     Category, 
     SUM(Cost)/(1.0 * SUM(Num)) 'AvgCostCat' 
    FROM 
     dbo.YourTable 
    GROUP BY 
     Category 
) 
UPDATE dbo.YourTable 
SET ave_cost_category = cc.AvgCostCat 
FROM CatCost 
WHERE dbo.YourTable.Category = cc.Category 
-1

カテゴリごとの平均費用を

update mytable set ave_cost = cost/num; 

を試してみてください、あなたの平均コストを更新するために、私はこれは、SQLサーバー上で動作するか分からないが、あなたは試すことができます:

update mytable set ave_cost_category = average 
from mytable 
inner join (
    select category, avg(ave_cost) as average 
    from mytable 
    group by category 
) as averages on table.category = averages.category 
1
UPDATE MyTable 
SET 
    ave_cost=cost/num, 
    ave_cost_category=t1.ave_cost_category 
FROM MyTable 
INNER JOIN 
(
    SELECT category,avg(ave_cost) as ave_cost_category 
    FROM MyTable 
    GROUP BY category 
) t1 on MyTable.category = t1.category 

JOINの内部クエリは、カテゴリ全体の平均コストを計算します。

+0

平均コストの平均をとることはできません。合計は、どのくらいの大きさの「num」に応じて重み付けする必要があります。加えて、まだ更新されていない列の値を使用しています。 –

+0

これは、OPが提供するテーブルを生成します。 – squillman

+1

真実 - 彼らは手段の平均が欲しいとは思っていません。そして第二の点はどうですか?あなたは 'ave_cost_category'を設定するために' avg(ave_cost) 'を選択していますが、' ave_cost'の値をその後すぐに変更します。 –

0

おそらくこれがお手伝いします:

UPDATE yourTable SET ave_cost_category = x.avgcost FROM 
    yourTable inner JOIN (SELECT category, AVG(ave_cost) AS avgcost 
FROM yourTable GROUP BY category) x 
    ON yourTable.category = x.category 
1
WITH t 
    AS (SELECT SUM(cost) OVER (PARTITION BY category) AS c, 
       SUM(num) OVER (PARTITION BY category) AS n, 
       * 
     FROM yourtable) 
UPDATE t 
SET ave_cost = cost/num, 
     ave_cost_category = c/n 
1

私は両方のテーブルの計算された列として作成することをお勧めします。

create function dbo.fnAveCostCat(@category int) 
returns decimal(10,3) 
as 
begin 
    declare @ave decimal(10,3) 
    select @ave = AVG(t.cost/t.num) 
     from YourTable t 
     where t.category = @category 
    return @ave 
end 
go 

alter table YourTable 
    add ave_cost as cost/num, 
     ave_cost_category as dbo.fnAveCostCat(category) 
go 
関連する問題