2017-10-30 11 views
0

私は以下の表形式を持っています。私がしようとしているのは、ItemIDがA-Sumで、Annual Column calueがTotalSumであるAnnual ColumnをProductCodeの合計に更新することです。SQLのGROUP BYでの合計

私は試しましたが、正しく動作していないようです。ここで

UPDATE #MainCalcTemp SET Annual = (Select Sum(CAST(Annual AS decimal(18,3))) 
     From #MainCalcTemp S 
     Where S.ProductCode = #MainCalcTemp.ProductCode AND S.ItemId != 'A-Sum') 

私のデータである。

ItemID Annual  ProductCode 
A-Sum TotalSum PHR 
PHR1 12   PHR 
PHR2 12   PHR 
PHR3 10   PHR 
A-Sum TotalSum LVA 
LVA1 10   LVA 
LVA2 10   LVA 
LVA3 10   LVA 
A-Sum    PQ 
PQ1  11   PQ 

結果

ItemID Annual  ProductCode 
A-Sum 34   PHR 
PHR1 12   PHR 
PHR2 12   PHR 
PHR3 10   PHR 
A-Sum 30   LVA 
LVA1 10   LVA 
LVA2 10   LVA 
LVA3 10   LVA 
A-Sum    PQ 
PQ1  11   PQ 
+0

、あなたは違いが2つのデータブロックであるか明確にすることができますか?最初のものはあなたの必要な結果ですか、もう一つはあなたの意図した結果ですか? – halfer

答えて

1

私はあなたが私はあなたが使用することを示唆している。この

UPDATE A 
SET A.Annual = (Select Sum(CAST(Annual AS decimal(18,3))) 
       From #MainCalcTemp S 
       Where S.ProductCode = A.ProductCode AND S.ItemId != 'A-Sum') 
FROM #MainCalcTemp A 
WHERE A.ItemId = 'A-Sum' 
+0

これはうまくいきました。あなたはとてもそうです – user1221989

+0

@ user1221989ようこそ! –

1

のような更新に別名が必要だと思います窓の機能:

with toupdate as (
     select s.*, 
      sum(case when s.ItemId <> 'A-Sum' then convert(integer, annual) end) over (partition by productcode) as new_annual 
     from #MainCalcTemp s 
    ) 
update toupdate 
    set annual = new_annual 
    where ItemId = 'A-Sum'; 

種類にも注意する必要があります。私はannualが整数だと推測していますが、それは当てはまりません。

+0

ご協力いただきありがとうございます – user1221989

0

あなたはこれを試すことができます。

UPDATE #MainCalcTemp SET Annual = (Select Sum(CAST(Annual AS decimal(18,3))) 
     From #MainCalcTemp S 
     Where S.ProductCode = #MainCalcTemp.ProductCode AND S.ItemId <> 'A-Sum') 
where ItemId = 'A-Sum' 
0

これは解決策は、あなたの近くにある:将来の読者の利益のために

UPDATE T 
    SET annual = (SELECT SUM(cast(annual as int)) FROM @tbl WHERE annual <> 'TotalSum' AND productCode = T.productCode GROUP BY productCode) 
FROM #MainCalcTemp T 
WHERE annual = 'TotalSum'