zoukankan      html  css  js  c++  java
  • sql server 中拥有相同字段值的记录某个字段合并问题解答

    一、问题

    有表如下:

    如何获得如下结果:

    二、解法一

    使用xml转换

    代码如下:

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

    解法二

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

    USE MyTest
    go
    --自定义函数根据ID返回连接后的body(我的数据库名叫body)
    CREATE FUNCTION Getresult(@id int)
    RETURNS nvarchar(20)
    AS
    BEGIN
    	DECLARE @resultstr nvarchar(100),@tempstr nvarchar(20)
    	DECLARE @tempid int
    	DECLARE mycursor CURSOR
    	FOR SELECT * FROM body
    	OPEN mycursor
    	FETCH next FROM mycursor INTO @tempid,@tempstr
    	WHILE (@@FETCH_STATUS=0)
    	BEGIN
    		IF(@tempid=@id)
    		BEGIN
    			SET @tempstr=stuff(@tempstr,1,0,',')
    			SET @resultstr=stuff(@tempstr,1,0,@resultstr)
    		END
    	   	FETCH next FROM mycursor INTO @tempid,@tempstr
    	END
    	SET @resultstr=STUFF(@resultstr,1,1,'')
    	CLOSE mycursor
    	DEALLOCATE mycursor
    	RETURN (@resultstr)
    END
    
    --函数建好后,执行以下SQL语句
    SELECT distinct m.ID, dbo.Getresult(m.ID) AS BODY
    FROM
    body AS m
    
    

    三、说明

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

  • 相关阅读:
    Maya 与 Matlab 数据互联插件使用教程
    代码可视化算法流程
    sql 至少含有
    sql update limit1
    c# windows service 程序
    c#和.net区别
    c#数据库乱码
    c#事件实质
    c#非界面线程控制控件
    mysql唯一查询
  • 原文地址:https://www.cnblogs.com/yuananyun/p/1914811.html
Copyright © 2011-2022 走看看