表A
ID name
1 A
2 C
3 D今天是2006-6-5
求输出以下列表
2006-6-5 A C D
10:00
10:30
11:00
11:30
12:00
12:30
13:00
...
22:00
ID name
1 A
2 C
3 D今天是2006-6-5
求输出以下列表
2006-6-5 A C D
10:00
10:30
11:00
11:30
12:00
12:30
13:00
...
22:00
一个结果集就行
差不多就是这个意思
Create Table A(ID Int,Name Varchar(10))
Insert A Select 1,'A'
Union All Select 2,'C'
Union All Select 3,'D'
GO
Declare @S Varchar(8000)
Select @S='SELECT Top 50 ID = Identity(Int,0,1) Into # From Syscolumns; Select Convert(Varchar(5),DateAdd(mi,30*ID,Convert(Varchar(11),GetDate(),120)+''10:00''),108) As ['+Convert(Varchar(10),GetDate(),120)+']'
Select @S=@S+','''' As '+Name From A Order By Name
Select @S=@S+' From # Where ID<=24; Drop Table #'
EXEC(@S)
GO
Drop Table A
--Result
/*
2006-06-05 A C D
10:00
10:30
11:00
11:30
12:00
12:30
13:00
13:30
14:00
14:30
15:00
15:30
16:00
16:30
17:00
17:30
18:00
18:30
19:00
19:30
20:00
20:30
21:00
21:30
22:00
*/
我试试
insert A select 'A'
union all select 'B'
union all select 'C'declare @s varchar(8000),@hour int,@min int
select @s='',@hour=10,@min=0
while @hour<=22
begin
set @min=0while @min<=30
begin
set @s=@s+' union all select '''+convert(varchar,@hour)+':'+right('0'+convert(varchar,@min),2)+''' ['+convert(varchar(10),getdate(),120)+'] '
select @s=@s+',null ['+name+']' from A
select @min=(case when @min=0 then 30 when @min=30 then 31 end)
endset @hour=@hour+1
end
set @s=stuff(@s,1,11,'')
exec (@s)
drop table A/*
2006-06-05 A B C
---------- ----------- ----------- -----------
10:00 NULL NULL NULL
10:30 NULL NULL NULL
11:00 NULL NULL NULL
11:30 NULL NULL NULL
12:00 NULL NULL NULL
12:30 NULL NULL NULL
13:00 NULL NULL NULL
13:30 NULL NULL NULL
14:00 NULL NULL NULL
14:30 NULL NULL NULL
15:00 NULL NULL NULL
15:30 NULL NULL NULL
16:00 NULL NULL NULL
16:30 NULL NULL NULL
17:00 NULL NULL NULL
17:30 NULL NULL NULL
18:00 NULL NULL NULL
18:30 NULL NULL NULL
19:00 NULL NULL NULL
19:30 NULL NULL NULL
20:00 NULL NULL NULL
20:30 NULL NULL NULL
21:00 NULL NULL NULL
21:30 NULL NULL NULL
22:00 NULL NULL NULL
22:30 NULL NULL NULL
*/
if exists(select * from sysobjects where name='temp') drop table temp
GO
--生成测试用表数据
create table Tb(ID int,NAME varchar(20))
insert into Tb select 1,'A'
union all select 2,'C'
union all select 3,'D'
GO
-- 得到一个空表结构 */
Declare @Sql varchar(8000)
set @sql='select 时间段='' '''
select @sql=@sql +','+name+'=max(case NAME when '''+NAME+''' then '' '' else '' '' end)' from Tb group by name
exec (@sql+' into temp from Tb where 1>2 group by id')
--select * from temp
GO-- 插入10~22点的值
Declare @Dt datetime
Declare @strT varchar(8000)
set @dt='2006-06-05 10:00:00'
while @Dt<='2006-06-05 22:00:00'
BEGIN
set @strT='insert into temp(时间段) values('''+convert(varchar(5),@dt,8)+''')'
--select @strT
exec (@strT)
set @Dt=dateadd(mi,30,@Dt)
END
select * from Temp--删除临时数据
GO
drop table Tb,temp
----- ---- ---- ----
10:00 NULL NULL NULL
10:30 NULL NULL NULL
11:00 NULL NULL NULL
11:30 NULL NULL NULL
12:00 NULL NULL NULL
12:30 NULL NULL NULL
13:00 NULL NULL NULL
13:30 NULL NULL NULL
14:00 NULL NULL NULL
14:30 NULL NULL NULL
15:00 NULL NULL NULL
15:30 NULL NULL NULL
16:00 NULL NULL NULL
16:30 NULL NULL NULL
17:00 NULL NULL NULL
17:30 NULL NULL NULL
18:00 NULL NULL NULL
18:30 NULL NULL NULL
19:00 NULL NULL NULL
19:30 NULL NULL NULL
20:00 NULL NULL NULL
20:30 NULL NULL NULL
21:00 NULL NULL NULL
21:30 NULL NULL NULL
22:00 NULL NULL NULL(所影响的行数为 25 行)
---------------------------
高手
你漏了一个空格
Create Table A(IDInt,Name Varchar(10))
-----------------^
因为他的动态sql语句中,竟然手动将表A中的name列的值加进去。
表A的数据是不确定的,
所以,像dutguoyi(新鲜鱼排)那样通过循环将表A中的name列的值加进去,这种方法更好。
而且,我想这个效率根本差不了多少哦。但是dutguoyi(新鲜鱼排)方法也有一个致命伤, 因为我们知道动态SQL语句中,语句的长度是有约定的。
如果长度超过8,000,则会被截断,从而导致问题。总的来说,我反但比较看好wwh999(印钞机的卖 V2.0...发梦ing)的方法。
先创建一个临时表,然后向表中逐条记录的插入。
而且,我想在楼主的应用环境中,性能一定能满足要求
游鱼的方法还有待完善.
因为他的动态sql语句中,竟然手动将表A中的name列的值加进去。
表A的数据是不确定的,
所以,像dutguoyi(新鲜鱼排)那样通过循环将表A中的name列的值加进去,这种方法更好。
而且,我想这个效率根本差不了多少哦。------------------------------------------------------------------我手動加了name列的值??再看看我的語句??如果是手動加進去,我有必要用動態語句嗎??因為這個循環比較小,可能效率上相差不多,但是數據稍微大點,就有差距了。
“Select @S=@S+','''' As '+Name From A Order By Name”
你不是手动加入的,是我看错了。不过,我仍然认为wwh999的方法不错。(如果我要用的话,我还是会用他的方法。:-), 个人喜好问题)因为以前,遇到过几次动态SQL语句不够长的情况。
如果这个应用中不存在这个问题, 那当然是你的办法更佳了。见笑,班门弄斧了。(游鱼, 英勇不减当年哦。结贴也来看看, 8错8错, 向你学习)