
一个数据库的笔试题,求解
已经一个表的结构如下:COL1   COL2 a      aaa b &...
已经一个表的结构如下:
COL1   COL2
 a      aaa
 b      bbb
 a      aa2
 a      aa3
 b      bb2
求SQL语句,其运行后的输出结果如下:
a aaa,aa2,aa3
b bbb,bb2
期待高手解答下,谢谢:) 展开
COL1   COL2
 a      aaa
 b      bbb
 a      aa2
 a      aa3
 b      bb2
求SQL语句,其运行后的输出结果如下:
a aaa,aa2,aa3
b bbb,bb2
期待高手解答下,谢谢:) 展开
展开全部
如果是普通问题
select 一下就出来了
例如:SELECT COL2 FROM 表名 WHERE COL1='a';
如果是 行转列 的问题:
给你一个列子:
表一
学生编号 学生姓名 科别 分数
1083 张三 语文 75
1083 张三 数学 84
1083 张三 英语 92
1084 李四 语文 84
1084 李四 数学 93
1084 李四 英语 87
怎么得出如下的表
学生编号 学生姓名 语文 数学 英语
1083 张三 75 84 92
1084 李四 84 93 87
Select 学生编号,学生姓名,sum(case when 科别=’语文’ then 分数 else 0 end) as 语文,sum(case when 科别=’数学’ then 分数 else 0 end) as 数学,sum(case when 科别=’英语’ then 分数 else 0 end) as 英语 from A group by 学生编号,学生姓名
再给你一个分析网址 一点一点 帮你分析
http://blog.sina.com.cn/s/blog_4cca663f0100abfv.html
铁定能用 希望可以帮到你
select 一下就出来了
例如:SELECT COL2 FROM 表名 WHERE COL1='a';
如果是 行转列 的问题:
给你一个列子:
表一
学生编号 学生姓名 科别 分数
1083 张三 语文 75
1083 张三 数学 84
1083 张三 英语 92
1084 李四 语文 84
1084 李四 数学 93
1084 李四 英语 87
怎么得出如下的表
学生编号 学生姓名 语文 数学 英语
1083 张三 75 84 92
1084 李四 84 93 87
Select 学生编号,学生姓名,sum(case when 科别=’语文’ then 分数 else 0 end) as 语文,sum(case when 科别=’数学’ then 分数 else 0 end) as 数学,sum(case when 科别=’英语’ then 分数 else 0 end) as 英语 from A group by 学生编号,学生姓名
再给你一个分析网址 一点一点 帮你分析
http://blog.sina.com.cn/s/blog_4cca663f0100abfv.html
铁定能用 希望可以帮到你
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果这张表是写死了,倒可以写一条sql语句.如下是sqlsever语句
select COL1,
isnull(max(case when COL2='aaa' then COL2+',' end),'') +
isnull(max(case when COL2='aa2' then COL2+',' end),'') +
isnull(max(case when COL2='aa3' then COL2+',' end),'') +
isnull(max(case when COL2='bbb' then COL2+',' end),'') +
isnull(max(case when COL2='bb2' then COL2 end),'') as 'COL2'
from MyTable group by COL1
如果可能扩展,那就得用pl/sql了
select COL1,
isnull(max(case when COL2='aaa' then COL2+',' end),'') +
isnull(max(case when COL2='aa2' then COL2+',' end),'') +
isnull(max(case when COL2='aa3' then COL2+',' end),'') +
isnull(max(case when COL2='bbb' then COL2+',' end),'') +
isnull(max(case when COL2='bb2' then COL2 end),'') as 'COL2'
from MyTable group by COL1
如果可能扩展,那就得用pl/sql了
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
--帮你把语句写出来了,SQL SERVER
--全部执行可看到结果
--准备数据============================================================
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TempTable]') AND type in (N'U'))
DROP TABLE [dbo].[TempTable]
go
declare @T1 table(col1 varchar(10),col2 varchar(10))
insert into @T1
select 'a','aaa'
union all
select 'b','bbb'
union all
select 'a','aa2'
union all
select 'a','aa3'
union all
select 'b','bb2'
declare @T2 table(col1 varchar(10),col2 varchar(50))
select identity(int,1,1) as sortid,col1 into temptable from @T1 group by col1
--============================================================
--处理过程====================================================
declare @minid int
declare @maxid int
select @maxid = max(sortid),@minid = min(sortid) from temptable
declare @strSql varchar(4000)
declare @resSql varchar(4000)
set @strSql = ''
while @minid <= @maxid
begin
select @strSql = @strSql + col2 +',' from @T1 Where col1 = (select col1 from temptable where sortid = @minid)
Set @resSql = @strSql
Set @strSql = ''
select @resSql = substring(@resSql,1,len(@resSql)-1)
insert into @T2
select col1,@resSql from temptable where sortid = @minid
set @minid = @minid + 1
end
select * from @T2
--====================================================
--全部执行可看到结果
--准备数据============================================================
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TempTable]') AND type in (N'U'))
DROP TABLE [dbo].[TempTable]
go
declare @T1 table(col1 varchar(10),col2 varchar(10))
insert into @T1
select 'a','aaa'
union all
select 'b','bbb'
union all
select 'a','aa2'
union all
select 'a','aa3'
union all
select 'b','bb2'
declare @T2 table(col1 varchar(10),col2 varchar(50))
select identity(int,1,1) as sortid,col1 into temptable from @T1 group by col1
--============================================================
--处理过程====================================================
declare @minid int
declare @maxid int
select @maxid = max(sortid),@minid = min(sortid) from temptable
declare @strSql varchar(4000)
declare @resSql varchar(4000)
set @strSql = ''
while @minid <= @maxid
begin
select @strSql = @strSql + col2 +',' from @T1 Where col1 = (select col1 from temptable where sortid = @minid)
Set @resSql = @strSql
Set @strSql = ''
select @resSql = substring(@resSql,1,len(@resSql)-1)
insert into @T2
select col1,@resSql from temptable where sortid = @minid
set @minid = @minid + 1
end
select * from @T2
--====================================================
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
给你个例子参考,有三种方法:
--如何实现行列列合并
if not object_id('testdb..tb')is null
drop table tb
create table tb(id int, [value] varchar(10))
insert tb
select 1,'aa' union all
select 1,'bb' union all
select 2,'aaa' union all
select 2,'bbb' union all
select 2,'ccc'
go
select * from tb
--1、函数实现分组和并列
if object_id(N'dbo.f_str',N'FN') is not null
drop function dbo.f_str
go
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @r varchar(1000)
SELECT @r = isnull(@r+',','')+[value] FROM tb WHERE id=@id
RETURN @r
END
GO
-- 调用函数
SELECt id, [values] = dbo.f_str(id) FROM tb GROUP BY id
drop function dbo.f_str
-- 2、用apply和for XML查询处理
select * from (select distinct id from tb) t
outer apply
(
select [values]=stuff((select ','+[value] from tb where id=t.id for xml path('')), 1, 1, '')
)n
--3、使用group by 和 for xml
select id, [values]=stuff((select ','+[value] from tb where id=t.id for xml path('')), 1, 1, '')
from tb t
group by id
--如何实现行列列合并
if not object_id('testdb..tb')is null
drop table tb
create table tb(id int, [value] varchar(10))
insert tb
select 1,'aa' union all
select 1,'bb' union all
select 2,'aaa' union all
select 2,'bbb' union all
select 2,'ccc'
go
select * from tb
--1、函数实现分组和并列
if object_id(N'dbo.f_str',N'FN') is not null
drop function dbo.f_str
go
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @r varchar(1000)
SELECT @r = isnull(@r+',','')+[value] FROM tb WHERE id=@id
RETURN @r
END
GO
-- 调用函数
SELECt id, [values] = dbo.f_str(id) FROM tb GROUP BY id
drop function dbo.f_str
-- 2、用apply和for XML查询处理
select * from (select distinct id from tb) t
outer apply
(
select [values]=stuff((select ','+[value] from tb where id=t.id for xml path('')), 1, 1, '')
)n
--3、使用group by 和 for xml
select id, [values]=stuff((select ','+[value] from tb where id=t.id for xml path('')), 1, 1, '')
from tb t
group by id
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
create function getresult(@c varchar(100))
returns varchar(4000)
as
begin
declare @r varchar(4000)
set @result=''
select @r= isnull(@r+',','')+ COL2 from 表名 where COL1=@c
return @r
end
select COL1,dbo.getresult(COL1) from 表名 group by COL1
这是通过函数的方法来完成的。
先建了getresult(@c varchar(100)) 函数
然后通过
select COL1,dbo.getresult(COL1) from 表名 group by COL1
调用函数,字符串的合并是通过函数来完成的。
returns varchar(4000)
as
begin
declare @r varchar(4000)
set @result=''
select @r= isnull(@r+',','')+ COL2 from 表名 where COL1=@c
return @r
end
select COL1,dbo.getresult(COL1) from 表名 group by COL1
这是通过函数的方法来完成的。
先建了getresult(@c varchar(100)) 函数
然后通过
select COL1,dbo.getresult(COL1) from 表名 group by COL1
调用函数,字符串的合并是通过函数来完成的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询