首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

SQL合并语句有关问题

2012-01-22 
SQL合并语句问题ID姓名科目分数1张三数学901张三语文781张三英语862李四数学772李四物理76怎么将字段中相

SQL合并语句问题
ID     姓名     科目       分数
1       张三     数学       90
1       张三     语文       78
1       张三     英语       86
2       李四     数学       77
2       李四     物理       76

怎么将字段中相同的纪录合并,使表格变为

ID     姓名     科目       分数
1       张三     数学       90
                    语文       78
                    英语       86
2       李四     数学       77
                    物理       76


[解决办法]
create table tb070205(ID int, 姓名 nvarchar(10), 科目 nvarchar(10), 分数 int)
insert into tb070205
select 1 , '张三 ' , '数学 ', 90
union all select 1 , '张三 ' , '语文 ', 78
union all select 1 , '张三 ' , '英语 ', 86
union all select 2 , '李四 ' , '数学 ', 77
union all select 2 , '李四 ' , '物理 ', 76

select isnull(cast(b.ID as varchar(8)), ' ')ID,isnull(b.姓名, ' ')姓名,a.科目,a.分数 from tb070205 a
left join (select id,姓名,min(科目)科目 from tb070205 group by id,姓名)b on a.id=b.id and a.姓名=b.姓名 and a.科目=b.科目

drop table tb070205
[解决办法]
create table T(ID int, 姓名 varchar(10), 科目 varchar(10), 分数 int)
insert T select 1, '张三 ', '数学 ', 90
union all select 1, '张三 ', '语文 ', 78
union all select 1, '张三 ', '英语 ', 86
union all select 2, '李四 ', '数学 ', 77
union all select 2, '李四 ', '物理 ', 76
go

select col=identity(int, 1, 1), * into #T from T
order by ID

select
ID=case when col=(select min(col) from #T where ID=tmp.ID and 姓名=tmp.姓名) then rtrim(col) else ' ' end,
姓名=case when col=(select min(col) from #T where ID=tmp.ID and 姓名=tmp.姓名) then 姓名 else ' ' end,
科目, 分数
from #T as tmp

--result
ID 姓名 科目 分数
------------ ---------- ---------- -----------
1 张三 数学 90
语文 78
英语 86
4 李四 数学 77
物理 76

(5 row(s) affected)
[解决办法]
create table tb070205(ID, 姓名 nvarchar(10), 科目 nvarchar(10), 分数 int)
insert into tb070205
select 1 , '张三 ' , '数学 ', 90
union all select 1 , '张三 ' , '语文 ', 78
union all select 1 , '张三 ' , '英语 ', 86
union all select 2 , '李四 ' , '数学 ', 77
union all select 2 , '李四 ' , '物理 ', 76

select ID=(case 分数 when (select max(分数) from tb070205 where ID=a.ID and 姓名=a.姓名) then ID else cast( ' ' as char(1)) end),
姓名=(case 分数 when (select max(分数) from tb070205 where ID=a.ID and 姓名=a.姓名) then 姓名 else cast( ' ' as char(1)) end),科目,分数
from tb070205 a
------解决方案--------------------


如果有成百上千的记录,岂不要写成百上千的union?
--用这个试试
declare @mytable table (MYID decimal(18,0) NULL,ID decimal(18,0) NULL,
姓名 varchar(10),科目 varchar(10),分数 int)--定义好表变量
insert into @mytable (OrderID,ID,姓名,科目,分数) select ID OrderID,ID,姓名,科目,分数 from tablename where 科目= '数学 '--先插入数学科目
insert into @mytable (OrderID,ID,姓名,科目,分数) select ID OrderID,NULL ID,NULL 姓名,科目,分数 from tablename where 科目 <> '数学 '--再插入非数学科目
select ID,姓名,科目,分数 from @mytable order by MYID

热点排行