zoukankan      html  css  js  c++  java
  • sql server 使用for xml path 将1列多行转换为字符串连接起来,俗称 sql 合并字符

    由于项目的原因,需要将一些记录分类汇总,但还要列出相关的明细,这样的需求我还是第一次遇到,蛋疼了,还是请求一下度娘吧。搜索一番还是有结果,请看以下例子:

    create table tb ([id] int,[name] varchar(2))
    insert into tb
    select 1,'aa' union all
    select 2,'bb' union all
    select 1,'cc' union all
    select 3,'dd' union all
    select 2,'ee'

    select * from tb
    --查询
    select
    id,
    name=stuff((select ','+name from tb where id=t.id for xml path('')),1,1,'')
    from
    tb t
    group by
    id



    方法二:

    CREATE FUNCTION GET_STRING(@ID INT)
    RETURNS VARCHAR(50)
    AS
    BEGIN
    DECLARE @NAME VARCHAR(500)
    SELECT @NAME=ISNULL(@NAME+',','')+NAME FROM TB WHERE ID=@ID
    RETURN @NAME
    END


    SELECT ID ,DBO.GET_STRING(ID)NAME FROM TB GROUP BY ID

    -----------------------------------------------------------------------
    在oracle中,是有相对应的函数,sys_connect_by_path函数。

    先在这里把oracle的函数实现也写下吧

    select id
    ,itrim(max(sys_connect_by_path(name,','))) as name
    from
    (select id
    ,name
    ,lead(rnFirst) over(partition by no order by rnFirst)rnNext
    from
    (select a.id
    ,a.name
    ,row_number() over(order by a.id,a.name desc) rnFirst
    from @t a) tmpTable1
    ) tmpTable2
    start with rnNext is null
    connect by rnNext = PRior rnFirst
    group by id

    以上是实现oracle中的行转列方式。

    ********************************************下面我们来看一下sqlserver的,因为sqlserver没提供类似的函数,不知道sqlserver2012提供没

    不过sqlserver支持起来也很简单,使用cross apply和for xml path组合来用,这两个单独都知道是怎么回事,怎么使用,但是真不知道还有它俩组合来完成这个功能的,感到很是不可思议,这里要感谢下网络上的人,原来自己写东西都是把所学到的知识记录到本机,从不放到网上,也可能是最近吧,好多工作不会,都是通过网络帮助,就把我所知道的东西也都放到网上来,大家一起学习。

    sqlserver:

    select id, SUBSTRING(names, 1, len(names)-1) from @t AS A cross APPLY
    (SELECT NAME + ',' FROM @t AS B WHERE A.id = B.id FOR XML PATH('')) D (names)

    GROUP BY id, names

  • 相关阅读:
    (转)viso 形状搜索 无法使用 的解决办法
    Visio 2003 直线需要相交时的设置方法
    C# Serialport执行close()方法时,程序卡死的解决办法
    RabbitMQ核心技术总结
    kafka核心原理总结
    hadoop的价值在哪里
    从程序员小仙飞升上神,java技术开发要如何实现?
    明年大数据行业的趋势会是哪些?
    2016年末程序员应该知道的基本架构思想
    2016年末程序员突破自我的绝密方法分享
  • 原文地址:https://www.cnblogs.com/shoupifeng/p/3391465.html
Copyright © 2011-2022 走看看