查询视图A的结果合并,将最后一个字段值不同合并到一个字段中如下图所示,

前三条结果中除了异常代码不同其他都相同,用sql查询语句将前三条的结果异常代码合并为A,B,
如下图所示

oracle的方法和执行结果如下:

WITH tt AS (
SELECT '10' 样本id,'AFP' 项目,'20000' 光强度,'20' 浓度结果,'20130723' 测量批号,'maintainer' 操作者,'C' 异常代码 FROM dual UNION ALL
SELECT '10' 样本id,'AFP' 项目,'20000' 光强度,'20' 浓度结果,'20130723' 测量批号,'maintainer' 操作者,'A' 异常代码 FROM dual UNION ALL
SELECT '10' 样本id,'AFP' 项目,'20000' 光强度,'20' 浓度结果,'20130723' 测量批号,'maintainer' 操作者,'B' 异常代码 FROM dual UNION ALL
SELECT '102' 样本id,'AFP' 项目,'634564' 光强度,'20' 浓度结果,'20130723' 测量批号,'maintainer' 操作者,'C' 异常代码 FROM dual
)
SELECT 样本id,项目,光强度,浓度结果,测量批号,操作者,wm_concat(异常代码) FROM tt t GROUP BY 样本id,项目,光强度,浓度结果,测量批号,操作者;

温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-10-09

如果是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函数,不能保证以后继续有效,慎用

本回答被网友采纳
第2个回答  2013-10-09
要通过存储过程来实现追问

要用sql语句,我的是ACCESS数据库,使用自定义函数我能实现,但是sql语句呢

相似回答