关于表中列的聚合的解决

前端之家收集整理的这篇文章主要介绍了关于表中列的聚合的解决前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
sqlcode问题描述:
无论是在sql2000,还是在sql2005中,都没有提供字符串的聚合函数
@H_301_9@ 所以,当我们在处理下列要求时,会比较麻烦:
有表tb,如下:
idvalue
-----------
1aa
1bb
2aaa
2bbb
2ccc
需要得到结果:
id values
-----------------
1aa,bb
2aaa,bbb,ccc
即, group by id,求value的和(字符串相加)
@H_301_9@
1.旧的解决方法
@H_301_9@
--1.创建处理函数
CREATE FUNCTION dbo.f_str(@id int )
RETURNS varchar (8000)
AS
BEGIN
@H_301_9@ DECLARE @r varchar (8000)
@H_301_9@ SET @r= ''
@H_301_9@ SELECT @r=@r+ ',' +value
@H_301_9@ FROM tb
@H_301_9@ WHERE id=@id
@H_301_9@ RETURN STUFF(@r,1, '' )
END
GO
@H_301_9@
SELECt id, values =dbo.f_str(id)
FROM tb
GROUP BY id
@H_301_9@
--2.新的解决方法
--示例数据
DECLARE @t TABLE (id int ,value varchar (10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'
@H_301_9@
--查询处理
SELECT *
FROM (
@H_301_9@ SELECT DISTINCT
@H_301_9@ id
@H_301_9@ FROM @t
)A
OUTER APPLY(
@H_301_9@ SELECT
@H_301_9@ [ values ]=STUFF( REPLACE ( REPLACE (
@H_301_9@ (
@H_301_9@ SELECT value FROM @tN
@H_301_9@ WHERE id=A.id
@H_301_9@ FOR XMLAUTO
@H_301_9@ ), '<Nvalue="' , ',' ), '"/>' , '' ), '' )
)N
@H_301_9@
/* --结果
id values
---------------------------
1aa,bb
2aaa,ccc
(2行受影响)
--*/
@H_301_9@
--各种字符串分函数
@H_301_9@
@H_3_502@ --3.3.1使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar (10),col2 int )
INSERT tb SELECT 'a' ,1
UNION ALL SELECT 'a' ,2
UNION ALL SELECT 'b' ,1
UNION ALL SELECT 'b' ,2
UNION ALL SELECT 'b' ,3
@H_301_9@
--合并处理
--定义结果集表变量
DECLARE @t TABLE (col1 varchar (10),col2 varchar (100))
@H_301_9@
--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar (10),@col1 varchar (10),@col2 int ,@s varchar (100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s= ''
WHILE@@FETCH_STATUS=0
BEGIN
@H_301_9@ IF@col1=@col1_old
@H_301_9@ SELECT @s=@s+ ',' + CAST (@col2 as varchar )
@H_301_9@ ELSE
@H_301_9@ BEGIN
@H_301_9@ INSERT @t VALUES (@col1_old,STUFF(@s, '' ))
@H_301_9@ SELECT @s= ',' + CAST (@col2 as varchar ),@col1_old=@col1
@H_301_9@ END
@H_301_9@ FETCH tb INTO @col1,@col2
END
INSERT @t VALUES (@col1_old, '' ))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/* --结果
col1col2
---------------------
a1,2
b1,2,3
--*/
GO
@H_301_9@
@H_301_9@
/*==============================================*/
@H_301_9@
@H_301_9@
--3.3.2使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar (10),col2 int )
INSERT tb SELECT 'a' ,1
UNION ALL SELECT 'a' ,2
UNION ALL SELECT 'b' ,1
UNION ALL SELECT 'b' ,2
UNION ALL SELECT 'b' ,3
GO
@H_301_9@
--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar (10))
RETURNS varchar (100)
AS
BEGIN
@H_301_9@ DECLARE @re varchar (100)
@H_301_9@ SET @re= ''
@H_301_9@ SELECT @re=@re+ ',' + CAST (col2 as varchar )
@H_301_9@ FROM tb
@H_301_9@ WHERE col1=@col1
@H_301_9@ RETURN (STUFF(@re, '' ))
END
GO
@H_301_9@
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/* --结果
col1col2
---------------------
a1,2
b1,3
--*/
GO
@H_301_9@
/*==============================================*/
@H_301_9@
@H_301_9@
--3.3.3使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar (10),col2 int )
INSERT tb SELECT 'a' ,1
UNION ALL SELECT 'a' ,2
UNION ALL SELECT 'b' ,1
UNION ALL SELECT 'b' ,2
UNION ALL SELECT 'b' ,3
@H_301_9@
--合并处理
SELECT col1,col2= CAST (col2 as varchar (100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar (10),@col2 varchar (100)
UPDATE #t SET
@H_301_9@ @col2= CASE WHEN @col1=col1 THEN @col2+ ',' +col2 ELSE col2 END ,
@H_301_9@ @col1=col1,
@H_301_9@ col2=@col2
SELECT * FROM #t
/* --更新处理后的临时表
@H_471_1404@ col1col2
-----------------------
a1
a1,2
b1
b1,2
b1,3
--*/
--得到最终结果
SELECT col1,col2= MAX (col2) FROM #t GROUP BY col1
/* --结果
col1col2
---------------------
a1,2
b1,3
--*/
--删除测试
DROP TABLE tb,#t
GO
@H_138_1502@ @H_301_9@
@H_301_9@
/*==============================================*/
@H_301_9@
--3.3.4.1每组<=2条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar (10),col2 int )
INSERT tb SELECT 'a' ,1
UNION ALL SELECT 'a' ,2
UNION ALL SELECT 'b' ,1
UNION ALL SELECT 'b' ,2
UNION ALL SELECT 'c' ,3
@H_301_9@
--合并处理
SELECT col1,
@H_301_9@ col2= CAST ( MIN (col2) as varchar )
@H_301_9@ + CASE
@H_301_9@ WHEN COUNT (*)=1 THEN ''
@H_301_9@ ELSE ',' + CAST ( MAX (col2) as varchar )
@H_301_9@ END
FROM tb
GROUP BY col1
DROP TABLE tb
/* --结果
col1col2
--------------------
a1,2
b1,2
c3
--*/
@H_301_9@
--3.3.4.2每组<=3条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar (10),col2 int )
INSERT tb SELECT 'a' ,1
UNION ALL SELECT 'a' ,2
UNION ALL SELECT 'b' ,1
UNION ALL SELECT 'b' ,2
UNION ALL SELECT 'b' ,3
UNION ALL SELECT 'c' ,3
@H_301_9@
--合并处理
SELECT col1,
@H_301_9@ col2= CAST ( MIN (col2) as varchar )
@H_301_9@ + CASE
@H_301_9@ WHEN COUNT (*)=3 THEN ','
@H_301_9@ + CAST (( SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN ( MAX (a.col2), MIN (a.col2))) as varchar )
@H_301_9@ ELSE ''
@H_301_9@ END
@H_301_9@ + CASE
@H_301_9@ WHEN COUNT (*)>=2 THEN ',' + CAST ( MAX (col2) as varchar )
@H_301_9@ ELSE ''
@H_301_9@ END
FROM tba
GROUP BY col1
DROP TABLE tb
/* --结果
col1col2
----------------------
a1,2
b1,3
c3
--*/
GO
if not object_id( 'A' ) is null
@H_301_9@ drop table A
Go
Create table A([id] int ,[cname]nvarchar(2))
Insert A
select 1,N '张三' union all
select 2,N '李四' union all
select 3,N '王五' union all
select 4,N '蔡六'
Go
-->-->
@H_301_9@
if not object_id( 'B' ) is null
@H_301_9@ drop table B
Go
Create table B([id] int ,[cname]nvarchar(5))
Insert B
select 1,N '1,3' union all
select 2,N '3,4'
Go
create function F_str(@cnamenvarchar(100))
returns nvarchar(100)
as
begin
select @cname= replace (@cname,ID,[cname]) from A where patindex( '%,' +rtrim(ID)+ ',%' ,' +@cname+ ',' )>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B
@H_301_9@
idcname
---------------------------------------------------------------------------------------------------------------
1张三,李四,王五
2王五,蔡六

猜你在找的设计模式相关文章