标识号相同,后面列的内容相加

SQL合并函数与应用
本文介绍如何使用SQL自定义函数实现字符串的合并处理,并通过具体示例展示了如何针对不同场景进行数据合并,包括单列与多列数据的合并。

方法一

create table tb
(
   a int,
   b int
)
insert into tb(a,b) values(1,23)
insert into tb(a,b) values(1,32)
insert into tb(a,b) values(1,0)
insert into tb(a,b) values(2,8)
insert into tb(a,b) values(2,7)
insert into tb(a,b) values(3,6)
go

if object_id('fayoushop..f_hb') is not null
   drop function dbo.f_hb
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


select * from tb

drop table tb
 

方法二

使用用户定义函数,配合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

 

 

多个前列的合并
数据的原始状态如下:
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)

if object_id('pubs..tb') is not null
   drop table tb
go

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

if object_id('pubs..test') is not null
   drop table test
go
select ID,PR,CON , OPS = op + '(' + cast(sc as varchar(10)) + ')' into test from tb

--创建一个合并的函数
if object_id('pubs..f_hb') is not null
   drop function f_hb
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(OPS as varchar) from test 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 test

drop table tb
drop table test

--结果
id         pr         con        OPS               
---------- ---------- ---------- -------------------
001        p          c          差(6),好(2),一般(4)
002        w          e          差(8),好(7),一般(1)

(所影响的行数为 2 行)

 

create table b
(col varchar(20))

insert b values ('a')
insert b values ('b')
insert b values ('c')
insert b values ('d')
insert b values ('e')


declare @sql varchar(1024)
set @sql=''
select @sql=@sql+b.col+',' from (select col from b) as b
set @sql='select '''+@sql+''''
exec(@sql)

 

在WPS开发工具选项中编写JavaScript宏代码程序,对Excel文件中表格数据进行汇总统计并满足一下需求: 1.标题行从第二行开始,数据行从第三行开始,“信号名称”位于第二行第三,“频道名称”位于第二行第四,“故障类型”位于第二行第五,“发生时间”位于第二行第六,“恢复时间”位于第二行第七,“持续时间”位于第二行第八,“故障详情”位于第二行第九。 2.若“信号名称”中包含有阿拉伯数字,则查看含有相同阿拉伯数字的“信号名称”右对应的“频道名称”是否空白?若为空白,则将含有相同阿拉伯数字的“信号名称”按照节目名称是否完全一致进行“故障类型”、“发生时间”、“恢复时间”、“持续时间”、“故障详情”分类筛选出来一并显示并另起一统计该节目每种“故障类型”出现次数及对应的累加“持续时间”、“故障详情”;若非空白有节目名称内容,则根据含有相同阿拉伯数字的“信号名称”右对应不同的“频道名称”节目名称进行“故障类型”、“发生时间”、“恢复时间”、“持续时间”、“故障详情”分类筛选出来一并显示并另起一统计该节目每种“故障类型”出现次数及对应的累加“持续时间”、“故障详情”。 3.若“信号名称”中不包含有阿拉伯数字,则根据“信号名称”节目名称进行“故障类型”、“发生时间”、“恢复时间”、“持续时间”、“故障详情”分类筛选出来一并显示并另起一统计该节目每种“故障类型”出现次数及对应的累加“持续时间”、“故障详情”。
最新发布
06-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值