将多个表合并到一个现有表中

时间:2018-04-06 12:48:15

标签: sql-server database

这是表创建和插入查询

If not exists(select * from sysobjects where name='hrs')
Create table hrs(hr int)

declare @cnt int =1

while @cnt <= 12
begin
  insert into hrs values(@cnt)
  set @cnt=@cnt+1
end

上面的代码给出了类似的输出 enter image description here

但我只想要那个 enter image description here

declare @cnt1 int = 1

while @cnt1<=12
begin
   EXEC('select he'+@cnt1+' = case when hr = 1 then '+@cnt1+' end from hrs')
   set @cnt1=@cnt1+1
end

上面的代码返回12个不同的表,但我只想要一个表中的所有记录(不创建任何新表)。

那么,我该怎么做呢?

请帮帮我。

感谢。

2 个答案:

答案 0 :(得分:1)

您的查询没有多大意义,但您可以构建一个列列表,然后exec

declare @columns nvarchar(max)
declare @cnt int = 1
while @cnt <= 12
    begin
    set @columns = isnull(@columns + ', ', '') + 'He' + cast(@cnt as nvarchar) + 
        ' = sum(case when hr = ' + cast(@cnt as nvarchar) + ' then hr end)'
    end
declare @sql nvarchar(max) = 'select ' + @columns ' + from hr'
exec (@sql)

答案 1 :(得分:1)

这里all列是通过循环

动态创建的

以下是完整查询

declare @s varchar(MAX)=''
declare @j int = 1
while @j<=12
begin
if @j = 12
Set @s = @s+'he'+convert(varchar,@j)+'=MAX(case when hr='+convert(varchar,@j)+' then '+convert(varchar,@j)+' end)'
else
set @s = @s+'he'+convert(varchar,@j)+'=MAX(case when hr='+convert(varchar,@j)+' then '+convert(varchar,@j)+' end),'
set @j=@j+1
end
set @s = 'select '+@s+' from hrs'
exec(@s)