zoukankan      html  css  js  c++  java
  • sql server 中某个字段值合并【转】

    一、问题

    有表如下:

    如何获得如下结果:

    二、解法一

    使用xml转换

    代码如下:

    01 CREATE TABLE body
    02 (
    03     ID int,
    04     BODY nvarchar(20)   
    05 )
    06 go
    07 INSERT INTO body VALUES(1,'aaaa')
    08 INSERT INTO body VALUES(2,'bbbb')
    09 INSERT INTO body VALUES(1,'cccccc')
    10 INSERT INTO body VALUES(3,'ddddd')
    11 go
    12 SELECT * FROM body
    13   
    14 SELECT distinct a.ID,stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'') AS BODY
    15 FROM
    16 body a
    17   
    18   
    19 --具体思路是这样的:
    20 SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')
    21 --这条语句的作用是按照a中的ID查找body表中ID=a.ID的所有记录,并把它转换成一个xml(关于将查询集转换成xml的文章,
    22 --博客园有很多的,你可以去看看)
    23 stuff((SELECT ','+BODY FROM body WHERE ID=a.ID FOR xml path('')),1,1,'')
    24 --这条语句的作用是把生成的xml前面的一个逗号去掉并转化成标量值
    25 --最后用一个distinct去掉重复的记录

    解法二

    使用游标,这里我定义了一个函数,你也可以改成存储过程之类的

    01 USE MyTest
    02 go
    03 --自定义函数根据ID返回连接后的body(我的数据库名叫body)
    04 CREATE FUNCTION Getresult(@id int)
    05 RETURNS nvarchar(20)
    06 AS
    07 BEGIN
    08     DECLARE @resultstr nvarchar(100),@tempstr nvarchar(20)
    09     DECLARE @tempid int
    10     DECLARE mycursor CURSOR
    11     FOR SELECT * FROM body
    12     OPEN mycursor
    13     FETCH next FROM mycursor INTO @tempid,@tempstr
    14     WHILE (@@FETCH_STATUS=0)
    15     BEGIN
    16         IF(@tempid=@id)
    17         BEGIN
    18             SET @tempstr=stuff(@tempstr,1,0,',')
    19             SET @resultstr=stuff(@tempstr,1,0,@resultstr)
    20         END
    21         FETCH next FROM mycursor INTO @tempid,@tempstr
    22     END
    23     SET @resultstr=STUFF(@resultstr,1,1,'')
    24     CLOSE mycursor
    25     DEALLOCATE mycursor
    26     RETURN (@resultstr)
    27 END
    28   
    29 --函数建好后,执行以下SQL语句
    30 SELECT distinct m.ID, dbo.Getresult(m.ID) AS BODY
    31 FROM
    32 body AS m

    三、说明

    这里合并的字段都是字符串,下一次我会讨论如何对整形数字求和。

  • 相关阅读:
    ECS内网穿透
    设置服务器ssh会话时间
    VScode插件
    Linux拷贝U盘文件(命令行)
    打开IDM下载视频时弹出防火墙阻止下载,解决方案
    如何将jmeter.bat命令文件固定到任务栏
    jmeter安装教程
    安装JDK8.0(JDK1.8) & 环境变量配置 & idea中配置java路径
    教你不用任何第三方软件实现任务栏居中
    [Unity优化]gc03:代码优化
  • 原文地址:https://www.cnblogs.com/zhangq723/p/2205304.html
Copyright © 2011-2022 走看看