请教sql

rockswj 2009-09-19 10:43:59
学生 教师 教师评价
学生1 教师1 优
学生1 教师2 一般
学生2 教师1 一般
学生2 教师2 差
学生3 教师1 优

想得到的结果是每个学生的全部评价,用逗号隔开。


学生 教师评价

学生1 优,一般
学生2 一般,差
学生3 优

最好一条语句能搞定吗?
...全文
169 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
ws_hgo 2009-09-19
  • 打赏
  • 举报
回复
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(@学生 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 优
dawugui 2009-09-19
  • 打赏
  • 举报
回复
--sql 2000,使用函数解决.
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','优'
go

create 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'优'
go

select 学生, [教师评价] = stuff((select ',' + [教师评价] from tb t where 学生 = tb.学生 for xml path('')) , 1 , 1 , '')
from tb
group by 学生

drop table tb

/*
学生 教师评价
----- ------------
学生1 优,一般
学生2 一般,差
学生3 优

(3 行受影响)
*/
xiequan2 2009-09-19
  • 打赏
  • 举报
回复

--> 测试数据:[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 行受影响)

*/
feixianxxx 2009-09-19
  • 打赏
  • 举报
回复
╮(╯▽╰)╭

好久不写。。


速度慢了 。。。

继续潜水~
feixianxxx 2009-09-19
  • 打赏
  • 举报
回复
2000的做法 函数
-- =========================================
-- -----------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 优
--小F-- 2009-09-19
  • 打赏
  • 举报
回复
---2000用函数
----------------------------------------------------------------
-- 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 行受影响)
*/
feixianxxx 2009-09-19
  • 打赏
  • 举报
回复
-- =========================================
-- -----------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 优
config_man 2009-09-19
  • 打赏
  • 举报
回复
路过...
--小F-- 2009-09-19
  • 打赏
  • 举报
回复
----------------------------------------------------------------
-- 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 行受影响)
*/
feixianxxx 2009-09-19
  • 打赏
  • 举报
回复
if object_id('tb') is not null
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 行受影响)
*/
\
参考
fanzhouqi 2009-09-19
  • 打赏
  • 举报
回复
要个函数

34,875

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧