动态更新创建的临时表?基本?

时间:2012-10-23 20:11:10

标签: sql sql-server tsql

我有表-A ,其行数为“x”。 (对于这个例子,有8行)

我通过使用游标创建带有“x”列数的 Table-C 。 (使其动态化;应将更多行添加到表-A ,然后在表-C 中创建更多列

Table-C (x = 1 thru 8)
   UserID  1     2     3     4     5     6     7     8

创建 Table-C 后,会根据从网页输入框传回的用户ID将行插入 Table-C 。 (这是动态完成的)

Table-C after inserts:
   UserID  1     2     3     4     5     6     7     8  
   57      null  null  null  null  null  null  null  null  
   74      null  null  null  null  null  null  null  null  

现在我希望进行更新 表格B 包含数据,其中“x-column”列将UserID与创建的表-C

中的列相关联
Table-B:  
UserID  x-column  
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-C ,其中1表示B.-B.UserID = Table-C.column_heading

Table-C after update should look like this:  
   UserID  1     2     3     4     5     6     7     8  
   57      null  1     1     null  null  null  null  1  
   74      null  1     null  1     1     null  1     1  

我很难找出构建UPDATE循环的语法来处理这个问题。 我需要使用光标吗?

我很确定这不是火箭科学,我还在学习!

1 个答案:

答案 0 :(得分: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执行此操作。