诚心求教论坛的各位SQL技术达人指点迷津。
手上有个项目,求一条sql语句,对一组数据进行汇总。
数据如下:
表A
字段1 字段2 字段3 字段4 字段5 字段6 .....
A00001 检测浓度 盐酸 应在80%-99% 98% 合格
A00001 检测浓度 盐酸 应在80%-99% 92% 合格
A00001 检测浓度 盐酸 应在80%-99% 93% 合格
A00001 检测浓度 盐酸 应在80%-99% 97% 合格A00001 检测外观 盐酸 应为无色无味 无色无味 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格
A00001 检测浓度 硫酸 应在80%-99% 97% 合格
A00001 检测浓度 硫酸 应在80%-99% 93% 合格
A00002 检测浓度 盐酸 应在80%-99% 98% 合格
A00002 检测浓度 盐酸 应在80%-99% 92% 合格
A00002 检测浓度 盐酸 应在80%-99% 93% 合格
A00002 检测浓度 盐酸 应在80%-99% 97% 不合格....
....现求一条sql语句,查询后想要得到如下结果:
字段1 字段2 字段3 字段4 字段5 字段6 A00001 检测浓度 盐酸 应在80%-99% 98%,92%,93%,97% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 合格,不合格
A00001 检测浓度 硫酸 应在80%-99% 97%,93% 合格
A00002 检测浓度 盐酸 应在80%-99% 98%,92%,93%,97% 合格,不合格 主要功能:1.合并重复的项目2.如果字段1-字段4的数据相同,而字段5和字段6中有不同的数据,要在一行里显示出来。3.如果字段1-字段4的数据不同,就不需要合并
请教各位高人该如何实现?
手上有个项目,求一条sql语句,对一组数据进行汇总。
数据如下:
表A
字段1 字段2 字段3 字段4 字段5 字段6 .....
A00001 检测浓度 盐酸 应在80%-99% 98% 合格
A00001 检测浓度 盐酸 应在80%-99% 92% 合格
A00001 检测浓度 盐酸 应在80%-99% 93% 合格
A00001 检测浓度 盐酸 应在80%-99% 97% 合格A00001 检测外观 盐酸 应为无色无味 无色无味 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格
A00001 检测浓度 硫酸 应在80%-99% 97% 合格
A00001 检测浓度 硫酸 应在80%-99% 93% 合格
A00002 检测浓度 盐酸 应在80%-99% 98% 合格
A00002 检测浓度 盐酸 应在80%-99% 92% 合格
A00002 检测浓度 盐酸 应在80%-99% 93% 合格
A00002 检测浓度 盐酸 应在80%-99% 97% 不合格....
....现求一条sql语句,查询后想要得到如下结果:
字段1 字段2 字段3 字段4 字段5 字段6 A00001 检测浓度 盐酸 应在80%-99% 98%,92%,93%,97% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 合格,不合格
A00001 检测浓度 硫酸 应在80%-99% 97%,93% 合格
A00002 检测浓度 盐酸 应在80%-99% 98%,92%,93%,97% 合格,不合格 主要功能:1.合并重复的项目2.如果字段1-字段4的数据相同,而字段5和字段6中有不同的数据,要在一行里显示出来。3.如果字段1-字段4的数据不同,就不需要合并
请教各位高人该如何实现?
SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以,当我们在处理下列要求时,会比较麻烦:
有表tb, 如下:
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. 旧的解决方法-- 1. 创建处理函数
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, values=dbo.f_str(id)
FROM tb
GROUP BY id-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/
A00001 检测外观 盐酸 应为无色无味 无色无味,无色无味,无色无味 合格
A00001 检测浓度 硫酸 应在80%-99% 97%,93% 合格
A00002 检测浓度 盐酸 应在80%-99% 98%,92%,93%,97% 合格
不知道怎么把无色无味合并啊CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+',' + RESULT
FROM Z_COA_DRUG_BODY
WHERE STANDARD=@ID
RETURN STUFF(@SQL, 1, 1, '')
END
SELECT PROJECT, TEST_TYPE, REPORTED_NAME, STANDARD,
dbo.F_COMBINESTR(STANDARD) AS Expr1, CONCLUSION
FROM Z_COA_DRUG_BODY
GROUP BY PROJECT, TEST_TYPE, REPORTED_NAME, STANDARD, CONCLUSION
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+',' + (SELECT DISTINCT RESULT
FROM Z_COA_DRUG_BODY ) AS T
WHERE STANDARD=@ID
RETURN STUFF(@SQL, 1, 1, '')
END
/*
标题:按某字段合并字符串之一(简单合并)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间: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')
gocreate 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 iddrop 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')
goselect id, [value] = stuff((select ',' + [value] from tb t where id = tb.id for xml path('')) , 1 , 1 , '')
from tb
group by iddrop 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_cursorselect * from @t
drop table tb
CREATE FUNCTION F_COMBINESTR(@ID VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+',' + (SELECT DISTINCT RESULT
FROM Z_COA_DRUG_BODY ) FROM Z_COA_DRUG_BODY
WHERE STANDARD=@ID
RETURN STUFF(@SQL, 1, 1, '')
END 后 函数没问题 但是调用函数查询是说子查询的数量太多,不能用
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-04 15:19:28.123●●●●●
★★★★★soft_wsx★★★★★
*/
if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
insert tb
select
'A00001 ', '检测浓度', '盐酸', '应在80%-99%', '98%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '92%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸' , '应在80%-99%' , '93%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '97%' , '合格' union all select
'A00001 ' , '检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001 ' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味', '不合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '97%' , '合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '93%' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '98% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '92% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '93% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '97% ', '不合格'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
returns nvarchar(4000)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
go
if object_id('f_tb2') is not null drop function f_tb2
go
create function f_tb2(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
returns nvarchar(4000)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect a,b,c,dbo.f_tb(a,b,c) as e,dbo.f_tb2(a,b,c) as f from tb group by a,b,c
/*
a b c e f
A00001 检测浓度 硫酸 93%,97% 合格
A00001 检测浓度 盐酸 92%,93%,97%,98% 合格
A00001 检测外观 盐酸 无色无味 不合格 ,合格
A00002 检测浓度 盐酸 92% ,93% ,97% ,98% 不合格,合格
*/
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-11 17:54:44.950●●●●●
★★★★★soft_wsx★★★★★
*/
--
if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
insert tb
select
'A00001 ', '检测浓度', '盐酸', '应在80%-99%', '98%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '92%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸' , '应在80%-99%' , '93%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '97%' , '合格' union all select
'A00001 ' , '检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001 ' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味', '不合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '97%' , '合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '93%' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '98% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '92% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '93% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '97% ', '不合格'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
returns nvarchar(4000)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
go
if object_id('f_tb2') is not null drop function f_tb2
go
create function f_tb2(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100))
returns nvarchar(4000)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect a,b,c,d,dbo.f_tb(a,b,c) as e,dbo.f_tb2(a,b,c) as f from tb group by a,b,c,d
/*
a b c d e f
A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格 ,合格
A00002 检测浓度 盐酸 应在80%-99% 92% ,93% ,97% ,98% 不合格,合格
*/做好了!结贴给分吧!
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-11 17:44:50
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([字段1] nvarchar(6),[字段2] nvarchar(4),[字段3] nvarchar(2),[字段4] nvarchar(9),[字段5] nvarchar(4),[字段6] nvarchar(3))
INSERT [tb]
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'不合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'不合格'
GO
--SELECT * FROM [tb]-->SQL查询如下:
IF NOT OBJECT_ID('[f_str1]') IS NULL
DROP FUNCTION [f_str1]
GO
CREATE FUNCTION f_str1
(
@col1 NVARCHAR(200),
@col2 NVARCHAR(200),
@col3 NVARCHAR(200),
@col4 NVARCHAR(200)
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SELECT @r = ISNULL(@r +',','')+ [字段5]
FROM tb
WHERE 字段1=@col1 AND 字段2=@col2
AND 字段3=@col3 AND 字段4=@col4
GROUP BY [字段5]
RETURN @r
END
GO
IF NOT OBJECT_ID('[f_str2]') IS NULL
DROP FUNCTION [f_str2]
GO
CREATE FUNCTION f_str2
(
@col1 NVARCHAR(200),
@col2 NVARCHAR(200),
@col3 NVARCHAR(200),
@col4 NVARCHAR(200)
)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SELECT @r = ISNULL(@r +',','')+ [字段6]
FROM tb
WHERE 字段1=@col1 AND 字段2=@col2
AND 字段3=@col3 AND 字段4=@col4
GROUP BY [字段6]
RETURN @r
END
GOSELECT DISTINCT 字段1,字段2,字段3,字段4,
dbo.f_str1(字段1,字段2,字段3,字段4) 字段5,
dbo.f_str2(字段1,字段2,字段3,字段4) 字段6
FROM tb
/*
字段1 字段2 字段3 字段4 字段5 字段6
A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格,合格
A00002 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 不合格,合格
*/
RETURNS VARCHAR(8000)
AS
BEGIN
DECLARE @SQL VARCHAR(8000)
SET @SQL=''
SELECT @SQL=@SQL+',' + RESULT FROM (SELECT DISTINCT RESULT
FROM Z_COA_DRUG_BODY ) AS T
WHERE STANDARD=@ID
RETURN STUFF(@SQL, 1, 1, '')
END少了东西,晕
Microsoft SQL Server 2008 (RTM) - 10.0.1600.22 (Intel X86) Jul 9 2008 14:43:34 Copyright (c)
1988-2008 Microsoft Corporation Enterprise Evaluation Edition on Windows NT 5.1 <X86>
(Build 2600: Service Pack 3)
愿和大家共同进步
如有雷同、实属巧合
●●●●●2009-09-11 17:54:44.950●●●●●
★★★★★soft_wsx★★★★★
*/
--
if object_ID('TB') IS NOT NULL DROP TABLE TB
create table tb(a nvarchar(20),b nvarchar(20),c nvarchar(20),d nvarchar(20),e nvarchar(20),f nvarchar(20))
insert tb
select
'A00001 ', '检测浓度', '盐酸', '应在80%-99%', '98%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '92%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸' , '应在80%-99%' , '93%' , '合格' union all select
'A00001 ' , '检测浓度', '盐酸', '应在80%-99%' , '97%' , '合格' union all select
'A00001 ' , '检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001 ' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味' , '合格' union all select
'A00001' ,'检测外观', '盐酸' , '应为无色无味' , '无色无味', '不合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '97%' , '合格 ' union all select
'A00001' , '检测浓度', '硫酸' , '应在80%-99%' , '93%' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '98% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '92% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '93% ' , '合格 ' union all select
'A00002' , '检测浓度', '盐酸' , '应在80%-99%' , '97% ', '不合格'
go
if object_id('f_tb') is not null drop function f_tb
go
create function f_tb(@a nvarchar(100),@b nvarchar(100),@c nvarchar(100),@flag int)
returns nvarchar(4000)
as
begin
declare @sql nvarchar(4000)
set @sql=N''
if @flag=0
select @sql=@sql+N','+e from(select distinct e from tb where a=@a and b=@b and c=@c)a
else
select @sql=@sql+N','+f from(select distinct f from tb where a=@a and b=@b and c=@c)a
set @sql=stuff(@sql,1,1,N'')
return(@sql)
end
goselect a,b,c,d,dbo.f_tb(a,b,c,0) as e,dbo.f_tb(a,b,c,1) as f from tb group by a,b,c,d
/*
a b c d e f
A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格 ,合格
A00002 检测浓度 盐酸 应在80%-99% 92% ,93% ,97% ,98% 不合格,合格
*/合并函数
/*---------------------------------
-- Author : htl258(Tony)
-- Date : 2009-09-11 17:44:50
-- Version: Microsoft SQL Server 2008 (SP1) - 10.0.2531.0 (Intel X86)
Mar 29 2009 10:27:29
Copyright (c) 1988-2008 Microsoft Corporation
Enterprise Evaluation Edition on Windows NT 5.1 <X86> (Build 2600: Service Pack 2)---------------------------------*/
--> 生成测试数据表:tbIF NOT OBJECT_ID('[tb]') IS NULL
DROP TABLE [tb]
GO
CREATE TABLE [tb]([字段1] nvarchar(6),[字段2] nvarchar(4),[字段3] nvarchar(2),[字段4] nvarchar(9),[字段5] nvarchar(4),[字段6] nvarchar(3))
INSERT [tb]
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'合格' UNION ALL
SELECT N'A00001',N'检测外观',N'盐酸',N'应为无色无味',N'无色无味',N'不合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'97%',N'合格' UNION ALL
SELECT N'A00001',N'检测浓度',N'硫酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'98%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'92%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'93%',N'合格' UNION ALL
SELECT N'A00002',N'检测浓度',N'盐酸',N'应在80%-99%',N'97%',N'不合格'
GO
--SELECT * FROM [tb]-->SQL查询如下:SELECT DISTINCT 字段1,字段2,字段3,字段4,
STUFF((SELECT ','+字段5 FROM tb
WHERE 字段1=T.字段1 AND 字段2=T.字段2 AND 字段3=T.字段3 AND 字段4 =T.字段4
GROUP BY 字段5 FOR XML PATH('')),1,1,'') 字段5,
STUFF((SELECT ','+字段6 FROM tb
WHERE 字段1=T.字段1 AND 字段2=T.字段2 AND 字段3=T.字段3 AND 字段4 =T.字段4
GROUP BY 字段6 FOR XML PATH('')),1,1,'') 字段6
FROM tb t
/*
字段1 字段2 字段3 字段4 字段5 字段6
A00001 检测浓度 硫酸 应在80%-99% 93%,97% 合格
A00001 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 合格
A00001 检测外观 盐酸 应为无色无味 无色无味 不合格,合格
A00002 检测浓度 盐酸 应在80%-99% 92%,93%,97%,98% 不合格,合格
*/2005的写法.