在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
为文本字段实现类似"求和"的效果



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

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

相关文章:

  • 2022-12-23
  • 2022-02-12
  • 2022-12-23
  • 2021-06-30
  • 2021-11-30
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-12-23
  • 2022-01-29
相关资源
相似解决方案