`
shangjava
  • 浏览: 1236942 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

sql多行转为一列的合并问题

阅读更多

/*
标题:按某字段合并字符串之一(简单合并)
作者:大乌龟


描述:将如下形式的数据按id字段合并value字段。
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id value
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即:group by id, 求 value 的和(字符串相加)
*/
--1、sql2000中只能用自定义的函数解决
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

create function dbo.f_str(@id int) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return @str
end
go

--调用函数
select id , value = dbo.f_str(id) from tb group by id

drop function dbo.f_str
drop table tb


--2、sql2005中的方法
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by id

drop table tb


--3、使用游标合并数据
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
declare @t table(id int,value varchar(100))--定义结果集表变量
--
定义游标并进行合并处理
declare my_cursor cursor local for
select id , value from tb
declare @id_old int , @id int , @value varchar(10) , @s varchar(100)
open my_cursor
fetch my_cursor into @id , @value
select @id_old = @id , @s=''
while @@FETCH_STATUS = 0
begin
if @id = @id_old
select @s = @s + ',' + cast(@value as varchar)
else
begin
insert @t values(@id_old , stuff(@s,1,1,''))
select @s = ',' + cast(@value as varchar) , @id_old = @id
end
fetch my_cursor into @id , @value
END
insert @t values(@id_old , stuff(@s,1,1,''))
close my_cursor
deallocate my_cursor

select * from @t
drop table tb

分享到:
评论

相关推荐

    sybase数据库多行合并为一行多列.sql

    sybase数据库是不支持group_concat函数的,此文件为sybase存储过程样例,可以将多行信息按标识合并为一行多列。

    SQLServer中如何将一个字段的多个记录值合在一行显示

    SQLServer 中将一个字段的多个记录值合并到一行显示的实现方法 SQL Server 是一种关系型数据库管理系统,具有强大的数据处理能力和存储能力。在实际应用中,我们经常需要将一个字段的多个记录值合并到一行显示,以...

    access行转列示例

    “行转列”是将数据表中的一行数据转换为多列显示,反之,“列转行”则是将一列数据转化为多行展示。这两种操作在处理宽表和长表之间的转换时特别有用,例如,当需要将多个具有相同属性的数据项合并到同一列或者将...

    sql常用语句集锦 查询技巧

    例如,如果有一张销售表,包含产品、月份和销售额三列,可以使用`CASE`语句将不同月份的销售额转为一列显示,以便于分析。 2. **多行补充**: 当需要将分散在多行的数据合并成一行时,可以使用`UNION`或`UNION ALL...

    mysql复杂动态行转列解决方案

    当我们在处理数据时,有时会遇到需要将多行数据转换为一列的情况,这被称为“行转列”操作。在本篇中,我们将深入探讨如何在MySQL中解决复杂的动态行转列问题。 首先,我们要理解行转列的基本概念。在传统的SQL查询...

    SQL语句集锦

    例如,将不同季度的销售数据从多列转为一列显示,每个季度作为单独的行值。 2. **多行补充.sql**:这可能涉及合并多行数据,比如使用UNION或UNION ALL来组合不同的查询结果,或者在处理缺失数据时用COALESCE函数...

    sql高级进阶

    - 将结果集反向转置为一列:将多行数据合并为单个字段。 - 抑制结果集中的重复值:使用DISTINCT关键字。 - 利用“行转列”进行计算:在转换后的数据上进行分析计算。 - 给数据分组:使用GROUP BY子句对数据进行...

    oracle将以逗号分隔字符串转多行

    首先创建了一个名为`TEST2`的表,有三列:`id`(数值类型,长度为10),`name`(变长字符类型,最大长度为100),以及`teststr`(变长字符类型,最大长度为100)。 5. **插入数据**: 向`TEST2`表中插入了几条...

    Oracle的列转行问题

    这样,一行数据被拆分为多行,实现了列转行的效果。 具体的SQL语句如下: ```sql SELECT a.f1, b.fid, DECODE(b.fid, '数据 1', a.qty1, '数据 2', a.qty2, '数据 3', a.qty3) FROM f_distribution a, (SELECT '...

    数据库行列转换算法

    通过UNION ALL操作将不同列的数据合并到同一列中。例如,表`t_col_row`包含ID和三列数据c1, c2, c3,可以使用以下SQL语句将列转为行: ```sql SELECT id, 'c1' cn, c1 cv FROM t_col_row UNION ALL SELECT id, 'c2'...

    mysql 行转列和列转行实例详解

    要将这些列转为行,我们可以分别选择每一列并使用 UNION 合并结果: ```sql SELECT user_name, '语文' AS COURSE, CN_SCORE AS SCORE FROM test_tb_grade2 UNION SELECT user_name, '数学' AS ...

Global site tag (gtag.js) - Google Analytics