zoukankan      html  css  js  c++  java
  • SQL字符串的分组聚合(ZT)

    本文转载于T-Sql:字符串分组聚合,也许你还有更简单的办法?    

        今天在看订阅的RSS的时候,看到这么一个问题:T-Sql中如何对分组的信息进行聚合,并以逗号连接字符;也就是对一个表中的某个字段进行分组,然后对另一个字段聚合,如果表达得不太清楚,请看下面的表。

    原表:

    Parent
    Child
    Charles William
    Charles Harry
    Anne Peter
    Anne Zara
    Andrew Beatrice
    Andrew Eugenie


    处理后的结果: 

    Parent
    Children
    Charles William,Harry
    Anne Peter,Zara
    Andrew Eugenie,Beatrice

         貌似很简单,以我的思考,先写一个聚合函数,然后再查询语句里面调用这个聚合函数;实际上还有更简单的办法,这是作者给出的解决办法,没有用到自定义聚合函数,他用的是FOR XML PATH(‘’)这样的处理方式,感觉真是爽

    withas(
    select 'Charles' parent, 'William' child union
    select 'Charles', 'Harry' union
    select 'Anne', 'Peter' union
    select 'Anne', 'Zara' union
    select 'Andrew', 'Beatrice' union
    select 'Andrew', 'Eugenie'
    )

    SELECT parent, STUFF( ( SELECT ','+ child
                           
    FROM t a
                           
    WHERE b.parent = a.parent
                           
    FOR XML PATH('')),1 ,1, '')  children
    FROM t b
    GROUP BY parent

    如果你还有其他的解决办法,希望你也能给出你的答案, 多多益善

    考虑到不熟悉STUFF()这个函数,故根据这个思路自己写了另外的方法:

    select  parent,right(list,len(list)-1) from
    (
    select parent,
    (SELECT ','+ children
                            FROM t a  
                            where a.parent=b.parent                      
                            FOR XML PATH('')) as list
    from t b
    group by parent
    ) x

    最终查询出来的结果集和使用上面的Stuff函数是一样的.

    另外补充一下关于Stuff函数的用法:

    /*
    用法描述:
    Stuff(expression1_Str,startIndex,lengthInt,expression2_Str)函数共有四个参数,其功能是将expression1_Str中自startIndex位置起删除lengthInt个字符,然后将expression2插入到expression1_Str中的startIndex位置。
    */

    select 'abcdefg'
    select STUFF('abcdefg',1,0,'1234') --结果为'1234abcdefg'
    select STUFF('abcdefg',1,1,'1234') --结果为'1234bcdefg'
    select STUFF('abcdefg',2,1,'1234') --结果为'a1234cdefg'
    select STUFF('abcdefg',2,2,'1234') --结果为'a1234defg'

    --一般的程序设计语言和Sql语言一样,都把字符串当作字符数组处理,但一个差别在于,大多数程序设计语言的数组下标起始位为0,而Sql Server中为1,由于惯性思维,常常把一般程序设计语言中的0起始位带至SQL编程中。

  • 相关阅读:
    部署 AppGlobalResources 到 SharePoint 2010
    还原一个已删除的网站集
    使用仪表板设计器配置级联筛选器 (SharePoint Server 2010 SP1)
    File or arguments not valid for site template
    Pex and Moles Documentation
    Content Query Webpart匿名访问
    Running Moles using NUnit Console from Visual Studio
    Calling a WCF Service using jQuery in SharePoint the correct way
    Updating Content Types and Site Columns That Were Deployed as a Feature
    asp.net中判断传过来的字符串不为空的代码
  • 原文地址:https://www.cnblogs.com/51net/p/2390444.html
Copyright © 2011-2022 走看看