3

「x」行のテーブルAがあります。(この例では 8 行あります)

カーソルを使用して、「x」列のTable-Cを作成します。(これを動的にします。さらに行がTable-Aに追加されると、さらに多くの列がTable-Cに作成されます)

表 C (x = 1 ~ 8)
   ユーザー ID 1 2 3 4 5 6 7 8

Table-Cを作成した後、Web ページの入力ボックスから返されたユーザー ID に基づいて、行がTable-Cに挿入されます。(これは動的に行われます)

挿入後の表 C:
   ユーザー ID 1 2 3 4 5 6 7 8  
   57ヌルヌルヌルヌルヌルヌルヌルヌル  
   74ヌルヌルヌルヌルヌルヌルヌルヌル  

ここで、UPDATE
Table-Bには、列「x-column」が UserID を作成されたTable-Cの列に関連付けるデータが含まれています。

表 B:  
UserID x 列  
34 2  
34 3  
57 2  
57 3  
57 8  
74 2  
74 4  
74 5  
74 7  
74 8  
93 2  
93 4  

したがって、最終結果は、Table-B.UserID = Table-C.column_heading の 1 で Table -Cを動的に UPDATE することです。

更新後の表 C は次のようになります。  
   ユーザー ID 1 2 3 4 5 6 7 8  
   57 ヌル 1 1 ヌル ヌル ヌル 1  
   74 ヌル 1 ヌル 1 1 ヌル 1 1  

これを処理する UPDATE ループを構築するための構文を理解するのに苦労しています。カーソルを使用する必要がありますか?

これはロケット科学ではないと確信しています。私はまだ学んでいます!

4

1 に答える 1

2

プロセス全体を見ることなく、これをどのように実行できるかについての私の提案は次のとおりです。問題の一部はの構造であるtablecため、これを行うには、まずUNPIVOT関数を使用してピボットを解除tablecし、一時テーブルに挿入します。

select userid,
  value,
  col
into #temp
from tablec
unpivot
(
  value for col in ([1], [2], [3], [4], [5], [6], [7], [8])
) u

次に、次を使用して一時テーブルのデータを更新しますtableb

update t
set value = b.cnt
from #temp t
left join
(
  select count(x_column) cnt, x_column, userid
  from tableb
  group by x_column, userid
) b
  on t.userid = b.userid 
  and t.col = b.x_column

最後に、PIVOT関数を使用してデータを必要な形式に変換します。

select *
from
(
  select userid, value, col
  from #temp
) x
pivot
(
  max(value)
  for col in ([1], [2], [3], [4], [5], [6], [7], [8])
) p

SQL Fiddle with Demoを参照してください。

いくつかの提案はtablec、現在の時点で実際に作成する必要があるかどうかを確認することです。そうでない場合は、 を実行するときに作成できますPIVOT。その後、必要な最終結果にデータが含まれます。ただし、データを行の形式のままにしてから、私が行ったように列として返すことができます。

変換される列の数が不明な場合は、動的 SQL を使用して実行できます。

于 2012-10-23T20:27:06.160 に答える