按日期生成交叉表的问题

Corn1 2006-02-19 09:56:48
原始表:
V_Room_In:
hrRoomName hiName hiFirstDate hiEndDate
101 甲 2006-2-13 2006-2-14
101 乙 2006-2-17 2006-2-08
102 丙 2006-2-13 2006-2-14
103 丁 2006-2-13
103 戊 2006-2-17

生成:
房间号 2月12日 2月13日 2月14日 2月15日 2月16日 2月17日 2月18日 2月19日
101 甲 甲 乙 乙
102 丙 丙
103 丁 丁 丁 丁 丁,戊 丁,戊 丁,戊

请问该怎么写?(其中,生成表中的日期数不一定在原始表中的日期范围内,从2月12日至今天。原始表中hiEndDate不填表示至今)
...全文
159 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zjcxc 元老 2006-02-19
  • 打赏
  • 举报
回复
DECLARE @s nvarchar(4000), @dt datetime
SET @dt = '2006-02-12'
SET @s = ''
WHILE @dt < = GETDATE()
SELECT @s = @s + ','
+ QUOTENAME(STUFF(CONVERT(char(5), @dt, 101), 3, 1, '月')+'日')
+ ' = MAX(CASE WHEN ''' + CONVERT(CHAR(10), @dt, 112) + '''
BETWEEN hiFirstDate AND ISNULL(hiEndDate, GETDATE()) THEN hiName END)',
@dt = @dt + 1
EXEC('SELECT hrRoomName ' + @s + ' FROM V_Room_In GROUP BY hrRoomName')
$扫地僧$ 2006-02-19
  • 打赏
  • 举报
回复
create table V_Room_In
(
hrRoomName varchar(3),
hiName varchar(5),
hiFirstDate datetime,
hiEndDate datetime
)


insert V_Room_In select '101','甲','2006-2-13','2006-2-14'
insert V_Room_In select '101','乙','2006-2-17','2006-2-18'
insert V_Room_In select '102','丙','2006-2-13','2006-2-14'
insert V_Room_In select '103','丁','2006-2-13',NUll
insert V_Room_In select '103','戊','2006-2-17',NUll


--视图
create view VV_Room_In
as
select hrRoomName,hiName,hiFirstDate,isnull(hiEndDate,getdate()) as hiEndDate from V_Room_In


--函数
create function T_txt(@id varchar(3),@T_date datetime)
returns varchar(8000)
as
begin
declare @T_SQL varchar(8000)
set @T_SQL=''
select @T_SQL=@T_SQL + hiName +',' from VV_Room_In where hrRoomName=@id and @T_date between hiFirstDate and hiEndDate
if len(@T_SQL)>0
set @T_SQL=left(@T_SQL,len(@T_SQL)-1)
return @T_SQL
end


create proc T_proc
as
declare @T_SQL varchar(8000)
declare @begin datetime
declare @end datetime
declare @i int
declare @j int
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[#T]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[#T]
create table #T (T_date datetime)
select @begin=min(hiFirstDate) from V_Room_In
set @end=getdate()
set @j=datediff(dd,@begin,@end)
set @i=0
set @T_SQL=''
while @i<=@j
begin
insert #T select dateadd(dd,@i,@begin)
set @i=@i+1
end
select @T_SQL=@T_SQL +'max(case when T.T_date=''' + convert(char(10),T_date,120) + ''' then dbo.T_txt(V.hrRoomName,T.T_date) else '''' end) as ''' + convert(char(10),T_date,120) +''', ' from #T
set @T_SQL='select V.hrRoomName,' +left(@T_SQL,len(@T_SQL)-1) + ' from #T T,(select distinct hrRoomName from V_Room_In) V group by V.hrRoomName'
exec (@T_SQL)

exec T_proc

34,588

社区成员

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

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