分组查询的每组中某列的各行字符数据相加显示

puxidong 2008-07-07 11:06:19
分组查询的每组中某列的各行字符数据相加显示,即把每组中多行数据的某列通过字符相加显示成一行。
例如:分组查询的结果如下,
type name score
1 frank 90
1 joane 80
2 tom 100
2 jack 50
3 dong 99
3 bruce 90
我想要的结果是
type names sumScore
1 frankjoane 170
2 tomjack 150
3 dongbruce 189
由于数值分组加和统计很容易,但是由于要将字符串相加显示,有没有更简便的计算方法,请高手帮我写写这个sql语句,谢谢!
...全文
184 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
紫气东来_999 2008-07-21
  • 打赏
  • 举报
回复
这样的,一般要用函数,呵呵。
exy337 2008-07-21
  • 打赏
  • 举报
回复
8楼的方法试了下,能行.现顶上.
exy337 2008-07-21
  • 打赏
  • 举报
回复
UP.研究下8楼的代码先.
conan304 2008-07-21
  • 打赏
  • 举报
回复
--邹老大的东西:
--各种字符串分函数

--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

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
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
IF @col1=@col1_old
SELECT @s=@s+','+CAST(@col2 as varchar)
ELSE
BEGIN
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
END
FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO


/*==============================================*/


--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

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

/*==============================================*/


--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

--合并处理
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
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--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

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+CAST(MAX(col2) as varchar)
END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ----------
a 1,2
b 1,2
c 3
--*/

--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

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=3 THEN ','
+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ------------
a 1,2
b 1,2,3
c 3
--*/
GO
conan304 2008-07-21
  • 打赏
  • 举报
回复
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[tb]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[tb]
GO

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[f_str]') and xtype in (N'FN', N'IF', N'TF'))
drop function [dbo].[f_str]
GO

create table tb(type int,name varchar(10),score int)
insert tb select 1,'frank',90
union all select 1,'joane',80
union all select 2,'tom',100
union all select 2,'jack',50
union all select 3,'dong',99
union all select 3,'bruce',90
go

CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(50)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+[name]
FROM tb
WHERE type=@col1
RETURN @re
END
GO

select a.type,a.[name],'sumscore'=isnull(sum(b.score),0)
from (select type,[name]=dbo.f_str(type) from tb group by type)a
left join tb b
on a.type=b.type
group by a.type,a.[name]

drop table tb
drop function dbo.f_str

/*

(所影响的行数为 6 行)

type name sumscore
----------- -------------------------------------------------- -----------
1 frankjoane 170
2 tomjack 150
3 dongbruce 189

(所影响的行数为 3 行)

*/
jiangmin168168 2008-07-21
  • 打赏
  • 举报
回复
看错了,不好意思.没招,数据库操作应该没有办法,只可能外部foreach操作
jiangmin168168 2008-07-21
  • 打赏
  • 举报
回复
由于数值分组加和统计很容易,但是由于要将字符串相加显示
没太看明白,是否是这样呢?
select type , name, count(cast(score as float)) as sumScore
from tbName
group by type,name
ASCRIBE 2008-07-21
  • 打赏
  • 举报
回复
foreach
dengchenlu 2008-07-19
  • 打赏
  • 举报
回复
sql好像难实现
你可以放到数据集中用循环
nopole 2008-07-19
  • 打赏
  • 举报
回复
帮顶 关注中
hy_lihuan 2008-07-07
  • 打赏
  • 举报
回复
sql语句两个字段的值相加就是比较难处理的问题
hy_lihuan 2008-07-07
  • 打赏
  • 举报
回复
不会,也没有遇见过这样的问题

62,046

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧