zoukankan      html  css  js  c++  java
  • Tsql 聚合分组

    --表

    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。

  • 相关阅读:
    hdu 4002 Find the maximum
    hdu 2837 坑题。
    hdu 3123
    zoj Treasure Hunt IV
    hdu 2053 Switch Game 水题一枚,鉴定完毕
    poj 1430 Binary Stirling Numbers
    hdu 3037 Saving Beans
    hdu 3944 dp?
    南阳oj 求N!的二进制表示最低位的1的位置(从右向左数)。
    fzu 2171 防守阵地 II
  • 原文地址:https://www.cnblogs.com/zahxz/p/2812987.html
Copyright © 2011-2022 走看看