--表
create table test_groupBy
(
strID varchar(50),
strName varchar(50),
strCount varchar(50),
GroupC varchar(50),
mark int
)
insert into test_groupBy values('A107CD3','DM0687-1','0.00000000','CD',1)
insert into test_groupBy values('A107CD3','SM80231-1','0.00000000','CD',1)
insert into test_groupBy values('A107BJ1','M80136-1','0.00000000','BJ',1)
insert into test_groupBy values('A107CD3','SM20106B-1','0.00000000','CD',2)
insert into test_groupBy values('A107CS4','XR275583','0.00000000','CS',1)
insert into test_groupBy values('A107CD3','DM0427','0.00000000','CD',1)
insert into test_groupBy values('A107CS1','T271213M-2','0.00000000','CS',1)
insert into test_groupBy values('A107CD1','R379309','0.00000000','CD',1)
表视图如下:
想要按 Groupc字段进行分组,最终结果如下图:
t-sql代码:
declare @GroupID nvarchar(50) ;--分组关键字段
declare @nCount int;--临时表行数
declare @str nvarchar(max);--要进行拼接的查询字符串
select Groupc into #temp from test_groupBy group by groupc ;--聚合查询出关键字存入临时表中
select @nCount=count(*) from #temp;
set @str='';
while @nCount>0--行数大于0进入循环
Begin
select top 1 @GroupID=GroupC from #temp group by GroupC order by GroupC desc
set @GroupID=@GroupID;
--标题(分组关键字)
set @str=@str+N' select groupc,'''','''','''','''' from test_groupBy where groupc= '''+@GroupID+''' group by groupc '
set @str=@str+'Union all';
--组数据
set @str=@str+ N' select * from test_groupBy where groupc ='''+@GroupID+''' ';
set @str=@str+'Union all';
--删除临时表中已经处理的组关键字
delete from #temp where groupc=@GroupID
set @nCount=@nCount-1;
IF(@nCount<0)
break;
End
Declare @sql nvarchar(max)
set @sql=@str;
--去掉多余的字符串 ‘union all’
set @sql=Left(@str,len(@str)-9)
--select @sql
exec(@sql);
drop table #temp
用的方法比较土,主要是练习t-sql语句的使用
总结如下:
1、对于声明的变量赋值,不要忘记加set。
2、利用group by 之类的进行聚合查询的时候,要查询的字段要用max、sum等之类聚合表达式或必须出现在group by 之后。
3、while 的作用域为begin和end之间。while只在第一次进入循环时判断条件是否满足,要自己编写跳出循环判断语句。
4、使用union 操作符连接查询结果时要注意,查询结果的字段数和类型必须一样。
5、单引号的转义操作为两个单引号 即 ''='
6、exec(str)执行语句。
7、nvarchar(max),varchar(max)范围为2^31-1。用declare声明时可用来替换text。