同表按照计数字段大小输出相应字段数据
需求如图:
思路:
1.通过游标读取表中的所有数据ID集合
2.通过ID获取字段计数大小
3.遍历计数大小,拼接SQL语句
实现SQL代码:
DECLARE @id varchar(50) --定义id变量
declare @itemnumber int --定义需要循环的次数
declare @tagint int --定义标志字段,用于结束循环
declare @sql varchar(2000)-- 存储合并后的语句(数据多拼接就多,请评估选择类型)
declare @sqlf varchar(2000)--双重循环最后存储的SQL
declare @ual varchar(255)
set @tagint=1
set @sqlf=''; --SERVER中必须初始化才使用
DECLARE My_Cursor CURSOR --定义游标
FOR (SELECT websites.id FROM dbo.websites) --查出需要的集合放到游标中(查ID方面下面条件查询)
OPEN My_Cursor; --打开游标
FETCH NEXT FROM My_Cursor INTO @id; --读取第一行数据(将)
WHILE @@FETCH_STATUS = 0 --游标状态
BEGIN
select @itemnumber = websites.alexa from websites where websites.id=@id; --根据ID查询出需要循环的次数(对应你那边表中的count字段)
set @ual=' UNION ALL select websites.name from websites where id= '+@id;
set @sql=' select websites.name from websites where id= '+@id +' ';
if(@itemnumber>0)--判断条件
begin
while (@tagint<=(@itemnumber-1)) --循环条件
begin
set @sql=@sql+@ual
set @tagint=@tagint+1
end
set @tagint=1;
set @ual=' UNION ALL';
if(@sqlf='')--判断@sqlf是否是被付直过,没有就不需要加UNION ALL
begin
set @sqlf=@sqlf+@sql;
end
else
begin
set @sqlf=@sqlf+ @ual+@sql;
end
end
FETCH NEXT FROM My_Cursor INTO @id; --读取下一行数据(将下一个ID存在在@id中)
END
CLOSE My_Cursor; --关闭游标
DEALLOCATE My_Cursor; --释放游标
--剩下的游标请自己关闭释放
/* PRINT(@sqlf);*/
EXEC(@sqlf);
GO--结束