这样的数据库结构,如何排列,同时排列第一条记录和最后一条记录

时间:2022-02-22 21:41:18
编号     名称               电影ID   时间

3081 极限特工/1.rmvb 352 NULL
3082 极限特工/2.rmvb 352 NULL
3140 刀剑笑/1.rmvb 360 NULL
3155 变相怪杰2/1.rmvb 368 NULL
3156 变相怪杰2/2.rmvb 368 NULL
3157 球爱咖啡屋/1.rmvb 369 NULL
3166 大话西游之大圣娶   374 NULL

现在我想按 电影ID排列 提取到列表里:如:

极限特工/1.rmvb-- 极限特工/2.rmvb  时间

就是要重复的电影ID的 不同影片名称 在一行记录上显示
就是提取第一条,和最后一条记录 一行显示,能不能实现啊?
高手赐教
只有20分了!

7 个解决方案

#1


用函数实现

#2


-------没有经过测试----
create function f(@id int)
returns varchar(8000)
begin
declare @str varchar(8000)
declare @id_max int,@id_min int
select @str='',@id_max=0,@id_min=0
select @id_max=max(编号),@id_min=min(编号) from table_name where 电影ID=@id
select @str=@str+'--'+名称 from table_name where 电影ID=@id and (编号=@id_min or 编号=@id_max)
select @str=stuff(@str,1,2,'')
return @str
end

select dbo.f(电影ID) from table_name group by 电影ID

#3


create function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,1,'')
  end
go

#4


---创建测试数据
create table 表(编号 int,名称 varchar(100),电影ID int,时间 datetime)
  insert 表 select 3081,'限特工/1.rmvb', 352,NULL
  union all select 3082,'限特工/2.rmvb', 352,NULL
  union all select 3140,'剑笑/1.rmvb'  , 360,NULL
  union all select 3155,'相怪杰2/1.rmvb',368,NULL
  union all select 3156,'相怪杰2/2.rmvb',368,NULL
  union all select 3157,'爱咖啡屋/1.rmvb',369,NULL
  union all select 3166,'话西游之大圣娶', 374,NULL
---查看测试数据
select * from 表
---创建函数
create function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,1,'')
  end
go
---查看结果
select 电影ID,dbo.fnMergeT(电影ID) as 名称 from 表 group by 电影ID
/*
电影ID        名称                                                                                                                                                                                                                                                               
----------- --------------------------------
352         -限特工/1.rmvb--限特工/2.rmvb
360         -剑笑/1.rmvb
368         -相怪杰2/1.rmvb--相怪杰2/2.rmvb
369         -爱咖啡屋/1.rmvb
374         -话西游之大圣娶

(所影响的行数为 5 行)
*/

#5


if object_id('t') is not null
drop table t
create  table  t(编号 int,    名称 varchar(20), 电影ID   int, 时间 datetime)
insert into t     select 3081,'极限特工/1.rmvb', 352, NULL
union all         select 3082,'极限特工/2.rmvb',352, NULL
union all         select 3140,'刀剑笑/1.rmvb', 360, NULL
union all         select 3155,'变相怪杰2/1.rmvb',368, NULL
union all         select 3156,'变相怪杰2/2.rmvb',368, NULL
union all         select 3157,'球爱咖啡屋/1.rmvb',369, NULL
union all         select 3166,'大话西游之大圣娶', 374, NULL
select * from t

create function f_str(@Str  int)
returns varchar(100)
as
begin 
declare @e varchar(800)
set @e=''
select @e=@e+'-'+名称 from t where 电影ID=@Str order by 编号
set @e=stuff(@e,1,1,'')
return @e
end

select  电影ID, dbo.f_str(电影ID) as 名称   from t group by 电影ID

/*
电影ID 名称
-------------------------------------------------
352 极限特工/1.rmvb-极限特工/2.rmvb
360 刀剑笑/1.rmvb
368 变相怪杰2/1.rmvb-变相怪杰2/2.rmvb
369 球爱咖啡屋/1.rmvb
374 大话西游之大圣娶
*/

#6


改下我的那个函数
Alter function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,2,'')
  end
go
---查看结果
select 电影ID,dbo.fnMergeT(电影ID) as 名称 from 表 group by 电影ID
/*
电影ID        名称  
----------- ---------------------------
352         限特工/1.rmvb--限特工/2.rmvb
360         剑笑/1.rmvb
368         相怪杰2/1.rmvb--相怪杰2/2.rmvb
369         爱咖啡屋/1.rmvb
374         话西游之大圣娶

(所影响的行数为 5 行)
*/

#7



create table ta(编号 int, 名称 varchar(50), 电影ID int,  时间  int)

insert into ta
select 3081, '极限特工/1.rmvb', 352,NULL union all
select 3082, '极限特工/2.rmvb' , 352,NULL union all
select 3140, '刀剑笑/1.rmvb'   ,  360,NULL union all
select 3155, '变相怪杰2/1.rmvb', 368,NULL union all
select 3156, '变相怪杰2/2.rmvb',  368,NULL union all
select 3157, '球爱咖啡屋/1.rmvb', 369,NULL union all
select 3166, '大话西游之大圣娶',   374,NULL



declare @sql varchar(8000)
SELECT @sql = 'select 电影ID'
select @sql = @sql + ',max(case con when '''+cast(con as varchar)+''' then 名称 end ) as  '''+cast(con as varchar) +''''

 from (select distinct con  from (select a.*,(select count(1) 
from ta where 电影ID=a.电影ID and a.编号>编号) con  from ta a)a) as a
select @sql = @sql + ',sum(isnull(时间,0)) 时间 from (select a.*,(select count(1) 
from ta where 电影ID=a.电影ID and a.编号>编号) con  from ta a)a group by 电影ID'

--print @sql
exec(@sql)

/**
电影ID      0                 1  时间
------------------ ----------- ------------------- 
352   极限特工/1.rmvb      极限特工/2.rmvb    0
360   刀剑笑/1.rmvb                  NULL    0
368   变相怪杰2/1.rmvb     变相怪杰2/2.rmvb   0
369   球爱咖啡屋/1.rmvb              NULL     0
374   大话西游之大圣娶       NULL     0

警告: 聚合或其它 SET 操作消除了空值。

**/

#1


用函数实现

#2


-------没有经过测试----
create function f(@id int)
returns varchar(8000)
begin
declare @str varchar(8000)
declare @id_max int,@id_min int
select @str='',@id_max=0,@id_min=0
select @id_max=max(编号),@id_min=min(编号) from table_name where 电影ID=@id
select @str=@str+'--'+名称 from table_name where 电影ID=@id and (编号=@id_min or 编号=@id_max)
select @str=stuff(@str,1,2,'')
return @str
end

select dbo.f(电影ID) from table_name group by 电影ID

#3


create function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,1,'')
  end
go

#4


---创建测试数据
create table 表(编号 int,名称 varchar(100),电影ID int,时间 datetime)
  insert 表 select 3081,'限特工/1.rmvb', 352,NULL
  union all select 3082,'限特工/2.rmvb', 352,NULL
  union all select 3140,'剑笑/1.rmvb'  , 360,NULL
  union all select 3155,'相怪杰2/1.rmvb',368,NULL
  union all select 3156,'相怪杰2/2.rmvb',368,NULL
  union all select 3157,'爱咖啡屋/1.rmvb',369,NULL
  union all select 3166,'话西游之大圣娶', 374,NULL
---查看测试数据
select * from 表
---创建函数
create function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,1,'')
  end
go
---查看结果
select 电影ID,dbo.fnMergeT(电影ID) as 名称 from 表 group by 电影ID
/*
电影ID        名称                                                                                                                                                                                                                                                               
----------- --------------------------------
352         -限特工/1.rmvb--限特工/2.rmvb
360         -剑笑/1.rmvb
368         -相怪杰2/1.rmvb--相怪杰2/2.rmvb
369         -爱咖啡屋/1.rmvb
374         -话西游之大圣娶

(所影响的行数为 5 行)
*/

#5


if object_id('t') is not null
drop table t
create  table  t(编号 int,    名称 varchar(20), 电影ID   int, 时间 datetime)
insert into t     select 3081,'极限特工/1.rmvb', 352, NULL
union all         select 3082,'极限特工/2.rmvb',352, NULL
union all         select 3140,'刀剑笑/1.rmvb', 360, NULL
union all         select 3155,'变相怪杰2/1.rmvb',368, NULL
union all         select 3156,'变相怪杰2/2.rmvb',368, NULL
union all         select 3157,'球爱咖啡屋/1.rmvb',369, NULL
union all         select 3166,'大话西游之大圣娶', 374, NULL
select * from t

create function f_str(@Str  int)
returns varchar(100)
as
begin 
declare @e varchar(800)
set @e=''
select @e=@e+'-'+名称 from t where 电影ID=@Str order by 编号
set @e=stuff(@e,1,1,'')
return @e
end

select  电影ID, dbo.f_str(电影ID) as 名称   from t group by 电影ID

/*
电影ID 名称
-------------------------------------------------
352 极限特工/1.rmvb-极限特工/2.rmvb
360 刀剑笑/1.rmvb
368 变相怪杰2/1.rmvb-变相怪杰2/2.rmvb
369 球爱咖啡屋/1.rmvb
374 大话西游之大圣娶
*/

#6


改下我的那个函数
Alter function dbo.fnMergeT(@ID varchar(10))
  returns varchar(8000)
as 
  begin
     declare @sql varchar(8000)
     set @sql=''
     select @sql=@sql+'--'+[名称] from 表 where 电影ID=@ID
     return stuff(@sql,1,2,'')
  end
go
---查看结果
select 电影ID,dbo.fnMergeT(电影ID) as 名称 from 表 group by 电影ID
/*
电影ID        名称  
----------- ---------------------------
352         限特工/1.rmvb--限特工/2.rmvb
360         剑笑/1.rmvb
368         相怪杰2/1.rmvb--相怪杰2/2.rmvb
369         爱咖啡屋/1.rmvb
374         话西游之大圣娶

(所影响的行数为 5 行)
*/

#7



create table ta(编号 int, 名称 varchar(50), 电影ID int,  时间  int)

insert into ta
select 3081, '极限特工/1.rmvb', 352,NULL union all
select 3082, '极限特工/2.rmvb' , 352,NULL union all
select 3140, '刀剑笑/1.rmvb'   ,  360,NULL union all
select 3155, '变相怪杰2/1.rmvb', 368,NULL union all
select 3156, '变相怪杰2/2.rmvb',  368,NULL union all
select 3157, '球爱咖啡屋/1.rmvb', 369,NULL union all
select 3166, '大话西游之大圣娶',   374,NULL



declare @sql varchar(8000)
SELECT @sql = 'select 电影ID'
select @sql = @sql + ',max(case con when '''+cast(con as varchar)+''' then 名称 end ) as  '''+cast(con as varchar) +''''

 from (select distinct con  from (select a.*,(select count(1) 
from ta where 电影ID=a.电影ID and a.编号>编号) con  from ta a)a) as a
select @sql = @sql + ',sum(isnull(时间,0)) 时间 from (select a.*,(select count(1) 
from ta where 电影ID=a.电影ID and a.编号>编号) con  from ta a)a group by 电影ID'

--print @sql
exec(@sql)

/**
电影ID      0                 1  时间
------------------ ----------- ------------------- 
352   极限特工/1.rmvb      极限特工/2.rmvb    0
360   刀剑笑/1.rmvb                  NULL    0
368   变相怪杰2/1.rmvb     变相怪杰2/2.rmvb   0
369   球爱咖啡屋/1.rmvb              NULL     0
374   大话西游之大圣娶       NULL     0

警告: 聚合或其它 SET 操作消除了空值。

**/