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。

  • 相关阅读:
    scripting.dictionary的彻底研究
    希望老人江诗信
    JavaScript正则表达式
    ASP日期和时间函数示例
    Asp网页制作技巧
    常见URL字符及URL编码值
    ASP.NET中如何调用存储过程
    【网摘】C#处理Json的另外一种方式 拓荒者
    使用Lucene.net进行全文查找多关键字匹配 拓荒者
    C#通用类型转换 Convert.ChangeType 拓荒者
  • 原文地址:https://www.cnblogs.com/zahxz/p/2812987.html
Copyright © 2011-2022 走看看