asp+access 统计查询,将同一代码的多条记录的同一字段文本值合并到一个字段显示的问题

时间:2021-05-11 02:54:13
asp+access 统计查询,将同一代码的多条记录的同一字段文本值合并到一个字段显示的问题,请各位大虾指教物资计划表-detail, 结构如下:
rq                  name_id   username     name   shuliang    bz
2012-2-1       005            甲            轴承     5
2012-2-15      005           乙             轴承     8
2012-3-1       005            丙             轴承     7
.........................................................(略)
查询后显示:
           name_id      name       总数        bz

                       005          轴承     20           甲5,乙8,丙7

4 个解决方案

#1



--1. 创建表,添加测试数据 
CREATE TABLE tb(id int, [value] varchar(10)) 
INSERT tb SELECT 1, 'aa' 
UNION ALL SELECT 1, 'bb' 
UNION ALL SELECT 2, 'aaa' 
UNION ALL SELECT 2, 'bbb' 
UNION ALL SELECT 2, 'ccc' 

--SELECT * FROM tb 
/**//* 
id value 
----------- ---------- 
1 aa 
1 bb 
2 aaa 
2 bbb 
2 ccc 

(5 row(s) affected) 
*/ 


--2 在SQL2000只能用自定义函数实现 
----2.1 创建合并函数fn_strSum,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SET @values = '' 
SELECT @values = @values + ',' + value FROM tb WHERE id=@id 
RETURN STUFF(@values, 1, 1, '') 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum 

----2.2 创建合并函数fn_strSum2,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum2(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SELECT @values = isnull(@values + ',', '') + value FROM tb WHERE id=@id 
RETURN @values 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum2 


--3 在SQL2005/SQL2008中的新解法 
----3.1 使用OUTER APPLY 
SELECT * 
FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY( 
SELECT [values]= STUFF(REPLACE(REPLACE( 

SELECT value FROM tb N 
WHERE id = A.id 
FOR XML AUTO 
), '<N value="', ','), '"/>', ''), 1, 1, '') 
)N 

----3.2 使用XML 
SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '') 
FROM tb 
GROUP BY id 

--4 删除测试表tb 
drop table tb 

/**//* 
id values 
----------- -------------------- 
1 aa,bb 
2 aaa,bbb,ccc 

(2 row(s) affected) 



类似。。。

#2


access中难以用sql达到这种效果

#3


我已经解决了,需要的联系我。ccz202@qq.com

#4


利用类和dictionary。我已经解决了,需要的联系我。ccz202@qq.com

#1



--1. 创建表,添加测试数据 
CREATE TABLE tb(id int, [value] varchar(10)) 
INSERT tb SELECT 1, 'aa' 
UNION ALL SELECT 1, 'bb' 
UNION ALL SELECT 2, 'aaa' 
UNION ALL SELECT 2, 'bbb' 
UNION ALL SELECT 2, 'ccc' 

--SELECT * FROM tb 
/**//* 
id value 
----------- ---------- 
1 aa 
1 bb 
2 aaa 
2 bbb 
2 ccc 

(5 row(s) affected) 
*/ 


--2 在SQL2000只能用自定义函数实现 
----2.1 创建合并函数fn_strSum,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SET @values = '' 
SELECT @values = @values + ',' + value FROM tb WHERE id=@id 
RETURN STUFF(@values, 1, 1, '') 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum 

----2.2 创建合并函数fn_strSum2,根据id合并value值 
GO 
CREATE FUNCTION dbo.fn_strSum2(@id int) 
RETURNS varchar(8000) 
AS 
BEGIN 
DECLARE @values varchar(8000) 
SELECT @values = isnull(@values + ',', '') + value FROM tb WHERE id=@id 
RETURN @values 
END 
GO 

-- 调用函数 
SELECT id, VALUE = dbo.fn_strSum2(id) FROM tb GROUP BY id 
DROP FUNCTION dbo.fn_strSum2 


--3 在SQL2005/SQL2008中的新解法 
----3.1 使用OUTER APPLY 
SELECT * 
FROM (SELECT DISTINCT id FROM tb) A OUTER APPLY( 
SELECT [values]= STUFF(REPLACE(REPLACE( 

SELECT value FROM tb N 
WHERE id = A.id 
FOR XML AUTO 
), '<N value="', ','), '"/>', ''), 1, 1, '') 
)N 

----3.2 使用XML 
SELECT id, [values]=STUFF((SELECT ','+[value] FROM tb t WHERE id=tb.id FOR XML PATH('')), 1, 1, '') 
FROM tb 
GROUP BY id 

--4 删除测试表tb 
drop table tb 

/**//* 
id values 
----------- -------------------- 
1 aa,bb 
2 aaa,bbb,ccc 

(2 row(s) affected) 



类似。。。

#2


access中难以用sql达到这种效果

#3


我已经解决了,需要的联系我。ccz202@qq.com

#4


利用类和dictionary。我已经解决了,需要的联系我。ccz202@qq.com