为文本字段实现类似"求和"的效果

该篇文章是我于2009年6月10日通过自己编写的工具,批量从位于在博客园的博客站点(http://chenxizhang.cnblogs.com)同步而来。文章中的图片地址仍然是链接到博客园的。特此说明!

陈希章

原文地址:http://www.cnblogs.com/chenxizhang/archive/2008/06/23/1228380.html
原文标题:为文本字段实现类似"求和"的效果
原文发表:2008/6/23 10:40:00

在SQL Server里面,针对数字字段,我们可以用SUM函数求出多个值的总和。有的时候,我们需要为文本值实现类似的效果。例如

有一个表包含了计算机的基础信息,而另外一个表包含了IP地址信息。一个计算机可能对应了多个IP地址。如果我希望按照计算机分组,然后统计它所有的IP地址,那么该怎么办呢?

你可以通过下面的范例找到答案。我们的实现手段是通过一个函数来做。该函数接受两个参数,一个就是计算机的编号,一个则是我们希望连接字符串的分隔符。

这个函数的核心是使用了游标。 值得注意的是,下面的脚本你最好是每段注释下面的代码作为一个单独的批执行,而不要一次性全部执行。方法就是:选择每个注释下面的代码,然后按F5

 

-- 创建范例数据库
CREATE   DATABASE DEMO
GO  

USE DEMO
GO  

-- 创建两个表
CREATE   TABLE Computer(ID INT ,ComputerName NVARCHAR ( 10 ))
GO  

CREATE   TABLE IPAddress(ComputerID INT ,IPAddress NVARCHAR ( 20 ))
GO  

-- 增加10笔记算机记录,每个计算机增加2个IP地址
DECLARE   @I   INT
SET   @I = 1 ;
WHILE ( @I < 10 )
BEGIN
   
INSERT   INTO Computer VALUES ( @I , ' Computer ' + CONVERT ( NVARCHAR ( 2 ), @I ))
   
INSERT   INTO IPAddress VALUES ( @I , ' IPAddress ' +   CONVERT ( NVARCHAR ( 2 ), @I ))
   
INSERT   INTO IPAddress VALUES ( @I , ' IPAddress ' +   CONVERT ( NVARCHAR ( 2 ), @I + 1 ))
   
SET   @I = @I + 1
END
GO  

-- 查看两个表的资料
SELECT   *   FROM Computer
SELECT   *   FROM IPAddress

-- 合并查看两个表单资料
SELECT C. * ,I. *   FROM Computer C JOIN IPAddress I ON C.ID = I.ComputerID

-- 创建函数来处理字符串的合并
CREATE   FUNCTION SumString( @ID   INT , @Dismember   NVARCHAR ( 10 ))
RETURNS   NVARCHAR ( 1000 )
AS
BEGIN
   
DECLARE IPCursor CURSOR   FOR  
   
SELECT IPAddress FROM IPAddress WHERE ComputerID = @ID  

   
DECLARE   @RESULT   NVARCHAR ( 1000 )
   
DECLARE   @IP   NVARCHAR ( 20 )
   
SET   @RESULT = N ''    

   
OPEN IPCursor
   
FETCH   NEXT   FROM IPCursor INTO   @IP
   
WHILE   @@FETCH_STATUS = 0
   
BEGIN
       
IF ( @RESULT = N '' )
           
SET   @RESULT = @IP
       
ELSE
           
SET   @RESULT = @RESULT + @Dismember + @IP
       
FETCH   NEXT   FROM IPCursor INTO   @IP
   
END  

   
CLOSE IPCursor
   
DEALLOCATE IPCursor

   
RETURN   @RESULT
END
GO  

-- 最后做联合查询显示,其实这个时候已经用不着第二个表了
SELECT ID,ComputerName,dbo.SumString(ID,N ' , ' ) AS IPAddressList FROM Computer GROUP   BY ID,ComputerName



通过下面三个截图,可以很明显地看到区别

image image image

作者:陈希章
出处:http://blog.youkuaiyun.com/chen_xizhang
本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值