文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>SQL合并数据

SQL合并数据

时间:2010-10-20  来源:linguimou

> 把记录集中的多条相同的记录合并成一条记录SQL code
> /*
> 带符号合并行列转换(爱新觉罗.毓华 2007-11-19于海南三亚)
>
> 有表tb,其数据如下:
>  a b
>  1 1
>  1 2
>  1 3
>  2 1
>  2 2
>  3 1
> 如何转换成如下结果:
>  a b
>  1 1,2,3
>  2 1,2
>  3 1
> */
>
> create table tb
> (
>   a int,
>   b int
> )
> insert into tb(a,b) values(1,1)
> insert into tb(a,b) values(1,2)
> insert into tb(a,b) values(1,3)
> insert into tb(a,b) values(2,1)
> insert into tb(a,b) values(2,2)
> insert into tb(a,b) values(3,1)
> go
>
> --创建一个合并的函数
> create function f_hb(@a int)
> returns varchar(8000)
> as
> begin
>  declare @str varchar(8000)
>  set @str = ''
>  select @str = @str + ',' + cast(b as varchar) from tb where a = @a
>  set @str = right(@str , len(@str) - 1)
>  return(@str)
> End
> go
>
> --调用自定义函数得到结果:
> select distinct a ,dbo.f_hb(a) as b from tb
>
> drop table tb
> drop function f_hb
>
> /*
> 结果
> a           b    
> ----------- ------
> 1           1,2,3
> 2           1,2
> 3           1
>
> (所影响的行数为 3 行)
> */
>
> ----------------------------------------------------
> /*
> 多个前列的合并
> 数据的原始状态如下:
> ID  PR   CON  OP    SC
> 001 p    c    差    6
> 001 p    c    好    2
> 001 p    c    一般  4
> 002 w    e    差    8
> 002 w    e    好    7
> 002 w    e    一般  1
> 用SQL语句实现,变成如下的数据
> ID  PR   CON  OPS
> 001 p    c    差(6),好(2),一般(4)
> 002 w    e    差(8),好(7),一般(1)
> */
>
> create table tb
> (
>  id  varchar(10),
>  pr  varchar(10),
>  con varchar(10),
>  op  varchar(10),
>  sc  int
> )
>
> insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '差',    6)
> insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '好',    2)
> insert into tb(ID,PR,CON,OP,SC) values('001', 'p',    'c',    '一般',  4)
> insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '差',    8)
> insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '好',    7)
> insert into tb(ID,PR,CON,OP,SC) values('002', 'w',    'e',    '一般',  1)
> go
>
> --创建一个合并的函数
> create function f_hb(@id varchar(10) , @pr varchar(10) , @con varchar(10))
> returns varchar(8000)
> as
> begin
>  declare @str varchar(8000)
>  set @str = ''
>  select @str = @str + ',' + cast(OP as varchar) + '('
>                           + cast(sc as varchar) + ')'
>  from tb where id = @id and @pr = pr and @con = con
>  set @str = right(@str , len(@str) - 1)
>  return(@str)
> End
> go
>
> --调用自定义函数得到结果:
> select distinct id , pr , con , dbo.f_hb(id,pr,con) as ops from tb
>
> drop table tb
> drop function f_hb
>
> /*
> 结果
> id         pr         con        ops              
> ---------- ---------- ---------- ------------------
> 001        p          c          差(6),好(2),一般(4)
> 002        w          e          差(8),好(7),一般(1)
>
> (所影响的行数为 2 行)
> */
>
> ----------------------------------------------------
> /*如何将一列中所有的值一行显示
> 数据源
>  a
>  b
>  c
>  d
>  e
> 结果
> a,b,c,d,e
> */
>
> create table tb(col varchar(20))
> insert tb values ('a')
> insert tb values ('b')
> insert tb values ('c')
> insert tb values ('d')
> insert tb values ('e')
> go
>
> --方法一
> declare @sql varchar(1000)
> set @sql = ''
> select @sql = @sql + t.col + ',' from (select col from tb) as t
> set @sql='select result = ''' + @sql + ''''
> exec(@sql)
> /*
> result    
> ----------
> a,b,c,d,e,
> */
>
> --方法二
> declare @output varchar(8000)
> select @output = coalesce(@output + ',' , '') + col from tb
> print @output
> /*
> a,b,c,d,e
> */
>
> drop table tb
>
> --------------------------------------------------------------------合并列值
> 原著:邹建
> 改编:爱新觉罗.毓华  2007-12-16  广东深圳
>
> 表结构,数据如下:
> id    value
> ----- ------
> 1     aa
> 1     bb
> 2     aaa
> 2     bbb
> 2     ccc
>
> 需要得到结果:
> id     values
> ------ -----------
> 1      aa,bb
> 2      aaa,bbb,ccc
> 即:group by id, 求 value 的和(字符串相加)
>
> 1. 旧的解决方法(在sql server 2000中只能用函数解决。)
> --1. 创建处理函数
> 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(8000)
> AS
> BEGIN
>    DECLARE @r varchar(8000)
>    SET @r = ''
>    SELECT @r = @r + ',' + value FROM tb WHERE id=@id
>    RETURN STUFF(@r, 1, 1, '')
> END
> GO
>
> -- 调用函数
> SELECt id, value = dbo.f_str(id) FROM tb GROUP BY id
>
> drop table tb
> drop function dbo.f_str
>
> /*
> id          value     
> ----------- -----------
> 1           aa,bb
> 2           aaa,bbb,ccc
> (所影响的行数为 2 行)
> */
>
> --2、另外一种函数.
> 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 f_hb(@id int)
> returns varchar(8000)
> as
> begin
>  declare @str varchar(8000)
>  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 distinct id ,dbo.f_hb(id) as value from tb
>
> drop table tb
> drop function dbo.f_hb
>
> /*
> id          value     
> ----------- -----------
> 1           aa,bb
> 2           aaa,bbb,ccc
> (所影响的行数为 2 行)
> */
>
> 2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
> 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 * 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
> drop table tb
>
> /*
> id          values
> ----------- -----------
> 1           aa,bb
> 2           aaa,bbb,ccc
>
> (2 行受影响)
> */
>
>

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载