`

DB2 合并字段方法

 
阅读更多

今天一位以前的同事问起这个问题,以前貌似见过但是忘记了,随即上网查查了

参照了这个http://topic.csdn.net/u/20090926/22/43301a7a-00eb-4072-b0c1-c4158ed5a868.html

http://topic.csdn.net/u/20090925/09/4218b452-9696-4c5c-a687-e0f42196af3b.html

原始数据结构如下:
<!--StartFragment -->

------------------------------------------
文章名 作者  创建时间  附件名称
春天    程晓锋  2010-9-9  a.doc
春天    程晓锋  2010-9-9  b.doc
春天    程晓锋  2010-9-9  我的.ppt
---------------------------------------------

希望能有一套高效的方法,将其迅速整理成如下格式:
表2
-----------------------------------------------------------
文章名 作者  创建时间  附件名称
春天    程晓锋  2010-9-9  a.doc, b.doc, 我的.ppt
----------------------------------------------------------

CREATE TABLE T_BASE(ID INT,NAME VARCHAR(10),AGE INT);

INSET
INTO T_BASE VALUES
(
1,'ZHANG',30),
(
2,'YANG',28),
(
3,'LI',33);
CREATE TABLE T_DETAIL(ID INT,INFO VARCHAR(10));
INSERT INTO T_DETAIL VALUES
(
1,'ZHANG1'),
(
1,'ZHANG2'),
(
1,'ZHANG3'),
(
2,'YANG1'),
(
2,'YANG2'),
(
3,'LI1');

WITH B (FATHER,SON,ID,ALLINFO) AS
    (
SELECT  RTRIM(LTRIM(CHAR(A.ID)))|| CHAR(ROW_NUMBER() OVER(PARTITION BY ID)) AS FATHER,
           
RTRIM(LTRIM(CHAR(A.ID)))|| CHAR(ROW_NUMBER() OVER(PARTITION BY ID) + 1) AS SON,
            A.ID,
CAST(A.INFO AS VARCHAR(100))
   
FROM T_DETAIL A
   
UNION ALL
   
SELECT C.FATHER,C.SON,C.ID,
   
RTRIM(LTRIM(B.ALLINFO))||','||RTRIM(LTRIM(CHAR(C.INFO)))
   
FROM (SELECT 
   
RTRIM(LTRIM(CHAR(A.ID)))|| CHAR(ROW_NUMBER() OVER(PARTITION BY ID)) AS FATHER,
   
RTRIM(LTRIM(CHAR(A.ID)))|| CHAR(ROW_NUMBER() OVER(PARTITION BY ID) + 1) AS SON, FROM T_DETAIL A) AS C, B
   
WHERE B.SON= C.FATHER)
SELECT  E.ID,E.NAME,E.AGE,D.ALLINFO
FROM (SELECT ROW_NUMBER() OVER(PARTITION BY ID ORDER BY LENGTH(ALLINFO) DESC) AS ROW_NUM, B.ID,B.ALLINFO FROM B) AS D,T_BASE E
WHERE D.ROW_NUM = 1 AND D.ID=E.ID;

A.ID, A.INFO

 

 

===================================================================================

 

*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-11-06
地点:广东深圳

描述:将如下形式的数据按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

家里没有数据库 先保存一下 明天测试一下

 

分享到:
评论

相关推荐

    DB2到GreenPlum/PostgreSQL的转换指南

    IS NULL和IS NOT NULL谓词用于测试字段是否为空。这两种数据库系统都支持这些谓词,但在处理空值的行为上可能存在细微差别。 #### 2.4 临时表 临时表是在查询过程中创建的只供当前会话使用的表。DB2与GreenPlum/...

    DB2 merge语句使用教程

    本教程将详细介绍 DB2 Merge 语句的使用方法。 首先,让我们通过一个简单的例子来理解 DB2 Merge 语句的工作原理。假设我们有两个表,一个是雇员表(EMPLOYE),另一个是经理表(MANAGER)。这两个表都有员工号...

    DB2性能安全文件

    例如,在DB2中可以使用如下命令来查询字段信息: ``` SELECT COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'YOUR_TABLE_NAME'; ``` #### 二、如何通过...

    DB2学习手册

    10. **预防字段空值的处理:** 可以在字段定义时使用`NOT NULL`约束来确保字段不为空,或者在插入数据时使用默认值。 11. **取得处理的记录数:** 使用`ROW_COUNT()`函数来获取最近执行的SQL语句影响的行数。 12. **从...

    DB2使用经验积累及心得

    - **预防字段空值的处理**:在定义表时为列指定`NOT NULL`约束。 - **取得处理的记录数**:可以通过`SELECT COUNT(*) FROM table_name`统计记录数。 - **从存储过程返回结果集(游标)的用法**:使用`RETURN NEXT FROM...

    IBM DB2通用数据库SQL入门

    - SELECT语句:用于从数据库中检索数据,可以指定字段、表、条件等。 - INSERT语句:向数据库表中添加新记录。 - UPDATE语句:修改已存在记录的数据。 - DELETE语句:删除表中的特定记录。 - WHERE子句:在...

    DB2常用命令

    - **描述**: 将两个字符串合并为一个字符串。 - **应用场景**: 当需要组合多个字段形成新的字符串时,可以使用此命令。 以上命令是DB2中常用的几个方面,掌握了这些基本的命令,就可以进行数据库的基本操作和管理了...

    DB2 Version 9.1 for zOS AdministrationAdministration Guide

    - **反规范化**:在某些情况下,为了提高查询性能,可能需要合并一些表或添加额外的字段,但这可能会增加数据冗余。 - **数据类型选择**:根据数据的实际用途和需求选择最合适的类型,如使用DATE类型存储日期信息。 ...

    DB2之SQL优化浅析.pdf

    ### DB2之SQL优化浅析 #### 一、为什么要做SQL优化 在DB2数据库管理中,SQL优化是一项至关重要的工作。SQL语句是应用程序与...通过上述介绍的方法和原则,可以帮助DBA和开发人员更好地理解并实践DB2的SQL优化策略。

    DB2 SQL 精萃.pdf

    `UNION` 用于合并两个或多个 SELECT 语句的结果集,但会去除重复行。例如: ```sql (SELECT name FROM employees WHERE age &gt; 30) UNION (SELECT name FROM interns WHERE age &gt; 25); ``` 这个例子中,结果集包含了...

    深入理解DB2插入时间集群ITC表内部原理-contracted.doc

    而在v10.5及更高版本中,DB2进一步改进了这一机制,允许合并利用率低的扩展块,从而释放更多的空间。这一特性使得ITC表在处理高并发插入场景时,能更有效地管理存储资源,降低存储成本。 为了深入了解ITC表的工作...

    DB2 常用SQL

    例如,`UPDATE table_name SET column1 = 'new_value' WHERE condition` 将符合条件的行的column1字段更新为new_value。 4. 删除数据:DELETE语句可以删除表中的数据行。`DELETE FROM table_name WHERE condition` ...

    IBM DB2通用数据库SQL入门.rar

    7. 联接操作:JOIN关键字用于合并来自两个或更多表的数据。 三、IBM DB2 SQL特性 1. DB2 SQL扩展:除了标准SQL,DB2还支持一系列扩展功能,如嵌套SQL、用户自定义函数(UDF)、存储过程等。 2. 分区:通过分区技术...

    Aqua Data Studio 18.0(DB2 操作工具)

    - 表管理:支持对DB2数据库中的表进行增删改查操作,包括数据导入导出、字段定义、索引创建等。 - 触发器和存储过程:方便地创建、修改和执行触发器及存储过程,便于数据库逻辑操作。 2. **SQL开发**: - SQL...

    [原创]PWX for AS400 英文字段中存储中文如何处理(杨晓东2008-02-29)

    ### PWX for AS400 英文字段中存储中文的处理方法 #### 背景介绍 在处理跨语言环境的数据迁移时,经常会遇到字符集不兼容的问题,尤其是在使用AS400(即iSeries或I5/OS)这样的老旧系统时。AS400因其稳定性和可靠...

    DB2函数大全

    `CONCAT`函数用于连接两个字符串,如`SELECT CONCAT(FIRST_NAME, LAST_NAME) FROM T1`将合并FIRST_NAME和LAST_NAME字段形成全名。 `INSERT`函数允许在字符串的特定位置插入新的字符。例如,`INSERT(NAME, 3, 1, 'X'...

    db2开发经验

    1. **DELPHI中从DB2取BIGINT的数据:** 在DELPHI中可以通过ODBC或JDBC连接DB2,处理BIGINT类型的字段。 #### 六、DB2表及SP管理 1. **权限管理:** 包括数据库权限控制、模式权限控制、表空间权限控制、表权限控制、...

    根据相同的key合并值(行转列)

    在压缩包中的`db2_sql根据相同的key合并值.txt`文件,很可能是包含了一个具体的DB2 SQL查询示例,演示如何根据相同的key合并数据库中的值。这个文件的内容可能会详细解释每个部分的作用,包括选择哪些字段,如何进行...

Global site tag (gtag.js) - Google Analytics