如果是oracle,如下:
with tmp as (
select t.*, row_number() over(partition by id,项目,
光强度, 浓度结果,测量批号,操作者 order by 异常代码) r from A
)
select 样本id,项目,光强度, 浓度结果,测量批号,操作者,
substr(max(sys_connect_by_path(异常代码,',')),2) 异常代码
from tmp
group by 样本id,项目,光强度, 浓度结果,测量批号,操作者
start with r=1
connect by r-1=prior r and 样本id=prior 样本id and 项目=prior 项目
and 光强度=prior 光强度 and 浓度结果=prior 浓度结果
and 测量批号=prior 测量批号 and 操作者=prior 操作者
如果是sql server,可以先定义一个字符串聚集函数,大意如下:
create function sumstr(@id int)
returns varchar(4096)
as
begin
declare @s varchar(4096)
set @s = ''
select @s = @s + 异常代码
from (select * from A order by 异常代码 where 样本Id = @id) t
return @s
end
select 样本id, sumstr(异常代码) 异常代码
from A
group by 样本id
如果需要其它字段,一种是修改sumstr把其它列也做为参数传入,另一种是把A对需要的列做下distinct后和上面的sql再作个join即可
如果mysql,如下
select 样本id,项目,光强度, 浓度结果,测量批号,操作者,
group_concat(distinct 异常代码 order by 异常代码 separator ',') 异常代码
from A
group by 样本id,项目,光强度, 浓度结果,测量批号,操作者
虽然也写了一些sql的用法,但真心觉得这表设计得有问题,应该把异常代码定义成整数或长整数(按异常代码的种类可分别定义成0x1,0x2,0x4,0x8,....),这样合并时只要sum一下就可以了,如果有重的就先distinct一下
注:oralce的wmsys.wm_concat是一个undocument函数,不能保证以后继续有效,慎用
本回答被网友采纳