0

次のシナリオで 1 つの UPDATE ステートメントで更新するにはどうすればよいですか? 私は2つのテーブルを持っています。TableA には次のフィールドが含まれています: TestNumber、CO、CO2、N20、CH4、および TestNumber 列の値は 1、2、3 です。

TableA

TestNumber      CO      CO2     N2O     CH4  
 1                                                              
 2                                                              
 3  

TableB という名前の 2 番目のテーブルには、次のフィールドが含まれています: TestNumber、TestIdentifier、TestValue および値は以下のとおりです。

TableB

TestNumber      TestIdentifier  TestValue      
 1                 CO           12.3   
 1                 CO2          10     
 2                 CO           9.8    
 2                 N20          45     
 3                 CO           12.5   
 3                 CO2          13.0  

私は次のような結果を期待しています:

TestNumber      CO      CO2     N2O     CH4   
 1              12.3    10                                             
 2              9.8             45                                     
 3              12.5    13.0        

テーブル変数を宣言するようなコードのチャンクを使用してそれを行いました。次に、TableB のデータを table 変数に格納します。次に、SET rowCount =1 をループして 1 行を削除し、完全に機能する TableA を更新します。期待通りの結果が得られました。しかし、あまりにも多くのテーブル変数の宣言とループなしで、直接 UPDATE コマンドを実行できると思います。私は更新していますが、直接ではありません。

ループせずに直接更新する方法を知りたいです。

に返信:

4

2 に答える 2

1

これを試して :

を使用して、の列名と同じ形式でPIVOT変換できますTableBTableATestIdentifierTableB

Select TestNumber ,[Co],[CO2],[N2O],[CH4]
FROM
   ( Select TestNumber,TestIdentifier,TestValue from TableB) as sourceTable
pivot 
   (
    sum(TestValue) 
    for TestIdentifier in ([Co],[CO2],[N2O],[CH4])
   )
as pvt 

これで、単純に内部結合を使用しTestNumberて更新できますTableA

Update t
set t.Co=cte.CO,
t.CO2=cte.CO2,
t.N2O=cte.N2O,
t.CH4=cte.CH4
from TableA as t
inner join cte 
on cte.TestNumber=t.TestNumber

完全な sql クエリは次のとおりです。

;With cte (TestNumber ,[Co],[CO2],[N2O],[CH4])
 as
 (
  Select TestNumber ,[Co],[CO2],[N2O],[CH4]
  FROM
      ( Select TestNumber,TestIdentifier,TestValue from TableB) as sourceTable
  pivot 
      (
       sum(TestValue) 
       for TestIdentifier in ([Co],[CO2],[N2O],[CH4])
      )
  as pvt
 )
  Update t
  set t.Co=cte.CO,
  t.CO2=cte.CO2,
  t.N2O=cte.N2O,
  t.CH4=cte.CH4
  from TableA as t
  inner join cte 
  on cte.TestNumber=t.TestNumber

完全な解決策については、SQLFIDDLEを試してください

于 2012-10-31T06:34:29.897 に答える
0

ピボットテーブルについて何か読むことができます...多分それは役に立ちます。しかし、最初のテーブルが静的である場合..つまり、常に同じ列と同じ行である場合、次のようにすることができます。

Update tableA set
CO = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CO'),
CO2 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CO2'),
N20 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'N20'),
CH4 = (Select sum(testValue) from TableB where testNumber = 1 and testIdentifier = 'CH4')
where testNumber = 1

他のテストのためにこれをさらに2回書くことができます...または変数の場合..これをwhileループ内に書くことができます

于 2012-10-31T01:10:38.697 に答える