我有表-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循环的语法来处理这个问题。 我需要使用光标吗?
我很确定这不是火箭科学,我还在学习!
答案 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
一些建议是看你是否需要实际创建tablec
,如果没有,那么你可以在执行PIVOT
时创建它,然后数据就在你需要的最终结果。但是,您可以将数据保留为行的格式,然后将其作为列返回。
如果您正在转换未知数量的列,则可以使用动态sql执行此操作。