学生 教师 教师评价
学生1 教师1 优
学生1 教师2 一般
学生2 教师1 一般
学生2 教师2 差
学生3 教师1 优想得到的结果是每个学生的全部评价,用逗号隔开。
学生 教师评价学生1 优,一般
学生2 一般,差
学生3 优最好一条语句能搞定吗?
学生1 教师1 优
学生1 教师2 一般
学生2 教师1 一般
学生2 教师2 差
学生3 教师1 优想得到的结果是每个学生的全部评价,用逗号隔开。
学生 教师评价学生1 优,一般
学生2 一般,差
学生3 优最好一条语句能搞定吗?
drop table tb
create table tb(aa varchar(20),bb varchar(20))
insert into tb select '奥米茄', '地板' union all
select '瓷砖' ,'地板' union all
select '蒙娜丽莎','厨房设备' union all
select '实木复合地板' ,'涂料' select [values]=stuff((select '|'+aa from tb t where bb=tb.bb for xml path('')), 1, 1, ''),bb
from tb
group by bb
/*bb values
-------------------- --------------------
厨房设备 蒙娜丽莎
地板 奥米茄|瓷砖
涂料 实木复合地板(3 行受影响)
*/\
参考
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-09-19 10:45:26
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
insert [tb]
select '学生1','教师1','优' union all
select '学生1','教师2','一般' union all
select '学生2','教师1','一般' union all
select '学生2','教师2','差' union all
select '学生3','教师1','优'
--------------开始查询--------------------------
select 学生, [教师评价]=stuff((select ','+[教师评价] from tb t where 学生=tb.学生 for xml path('')), 1, 1, '')
from tb
group by 学生
----------------结果----------------------------
/* 学生 教师评价
----- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学生1 优,一般
学生2 一般,差
学生3 优(3 行受影响)
*/
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( a varchar(10),b varchar(10) , c varchar(10) )
go
insert tb SELECT
'学生1', '教师1' , '优' UNION ALL SELECT
'学生1', '教师2' , '一般' UNION ALL SELECT
'学生2', '教师1' , '一般' UNION ALL SELECT
'学生2', '教师2' , '差' UNION ALL SELECT
'学生3', '教师1' , '优'
go
select distinct a as 学生,
教师评价=STUFF((select ','+c from tb t where tb.a=t.a for xml path('') ),1,1,'')
from tb 学生 教师评价
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学生1 优,一般
学生2 一般,差
学生3 优
----------------------------------------------------------------
-- Author :fredrickhu(小F,向高手学习)
-- Date :2009-09-19 10:45:26
-- Version:
-- Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86)
-- Nov 24 2008 13:01:59
-- Copyright (c) 1988-2005 Microsoft Corporation
-- Developer Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
--
----------------------------------------------------------------
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
insert [tb]
select '学生1','教师1','优' union all
select '学生1','教师2','一般' union all
select '学生2','教师1','一般' union all
select '学生2','教师2','差' union all
select '学生3','教师1','优'
--------------开始查询--------------------------
CREATE FUNCTION dbo.f_strUnite(@id varchar(50))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + 教师评价 FROM tb WHERE 学生=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECT 学生, 教师评价 = dbo.f_strUnite(学生) FROM tb GROUP BY 学生
drop table tb
drop function dbo.f_strUnite
go
----------------结果----------------------------
/* 学生 教师评价
----- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学生1 优,一般
学生2 一般,差
学生3 优(3 行受影响)
*/
-- =========================================
-- -----------t_mac 小编-------------------
--------------------希望有天成为大虾----
-- =========================================IF OBJECT_ID('tb') IS NOT NULL
DROP TABLE tb
GO
CREATE TABLE tb( a varchar(10),b varchar(10) , c varchar(10) )
go
insert tb SELECT
'学生1', '教师1' , '优' UNION ALL SELECT
'学生1', '教师2' , '一般' UNION ALL SELECT
'学生2', '教师1' , '一般' UNION ALL SELECT
'学生2', '教师2' , '差' UNION ALL SELECT
'学生3', '教师1' , '优'
go
CREATE FUNCTION dbo.f_tb(@id varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + c FROM tb WHERE a=@id
RETURN STUFF(@str, 1, 1, '')
END
GO SELECT a as 学生, 教师评价 = dbo.f_tb(a) FROM tb GROUP BY a
drop table tb
drop function dbo.f_tb
学生 教师评价
---------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学生1 优,一般
学生2 一般,差
学生3 优
--> 测试数据:[tb]
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
insert [tb]
select '学生1','教师1','优' union all
select '学生1','教师2','一般' union all
select '学生2','教师1','一般' union all
select '学生2','教师2','差' union all
select '学生3','教师1','优'
create function f_join(@学生 as varchar(50))
returns varchar(200)
as
begin
declare @s varchar(200)
select @s=isnull(@s+',','')+[教师评价] from tb where [学生]=@学生
return @s
end
select [学生],教师评价=dbo.f_join([学生]) from [tb] group by [学生]/*
学生 教师评价
----- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
学生1 优,一般
学生2 一般,差
学生3 优(3 行受影响)*/
create table [tb]([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
insert [tb]
select '学生1','教师1','优' union all
select '学生1','教师2','一般' union all
select '学生2','教师1','一般' union all
select '学生2','教师2','差' union all
select '学生3','教师1','优'
gocreate function dbo.f_str(@学生 varchar(5)) returns varchar(100)
as
begin
declare @str varchar(1000)
set @str = ''
select @str = @str + ',' + cast(教师评价 as varchar) from tb where 学生 = @学生
set @str = right(@str , len(@str) - 1)
return @str
end
go--调用函数
select 学生 , 教师评价 = dbo.f_str(学生) from tb group by 学生drop function dbo.f_str
drop table tb/*
学生 教师评价
----- ----------------
学生1 优,一般
学生2 一般,差
学生3 优(所影响的行数为 3 行)
*/--sql 2005
create table [tb]([学生] nvarchar(5),[教师] nvarchar(5),[教师评价] nvarchar(4))
insert [tb]
select N'学生1',N'教师1',N'优' union all
select N'学生1',N'教师2',N'一般' union all
select N'学生2',N'教师1',N'一般' union all
select N'学生2',N'教师2',N'差' union all
select N'学生3',N'教师1',N'优'
goselect 学生, [教师评价] = stuff((select ',' + [教师评价] from tb t where 学生 = tb.学生 for xml path('')) , 1 , 1 , '')
from tb
group by 学生drop table tb/*
学生 教师评价
----- ------------
学生1 优,一般
学生2 一般,差
学生3 优(3 行受影响)
*/
go create table tb([学生] varchar(5),[教师] varchar(5),[教师评价] varchar(4))
insert tb
select '学生1','教师1','优' union all
select '学生1','教师2','一般' union all
select '学生2','教师1','一般' union all
select '学生2','教师2','差' union all
select '学生3','教师1','优'
--------------开始查询--------------------------
CREATE FUNCTION dbo.f_strUnite(@学生 varchar(50))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str =''
SELECT @str = @str + ',' + 教师评价 FROM tb WHERE 学生=@学生
RETURN STUFF(@str, 1, 1, '')
END
GO select distinct([学生]),dbo.f_strUnite([学生]) as 教师评价 from tb学生 教师评价
----- ----------------
学生1 优,一般
学生2 一般,差
学生3 优