高手支招,看看这个表怎么实现

cindyAng 2005-11-01 06:12:44

RID StartDate EndDate Value1 Title Value2
SAL 2005-11-01 2005-11-04 100 ABF 20
TWIN 2005-11-01 2005-11-04 102 ABF 20
DBL 2005-11-01 2005-11-04 101 ABF 20
TRP 2005-11-01 2005-11-04 99 ABF 20

如何从上表得到如下表
Period SAL TWIN DBL TRP ABF
2005-11-01/2005-11-02 100 102 101 99 20
2005-11-02/2005-11-03 100 102 101 99 20
2005-11-03/2005-11-04 100 102 101 99 20
...全文
158 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hphong 2005-11-16
  • 打赏
  • 举报
回复
来晚了
hphong 2005-11-16
  • 打赏
  • 举报
回复
楼上的和我想的一样,真是妙啊
zlp321002 2005-11-01
  • 打赏
  • 举报
回复
--给你写一个,你参考下:

--测试环境

Create table #T(RID varchar(10),StartDate varchar(20),EndDate varchar(20),Value1 int,Title varchar(10),Value2 int)
insert into #T select 'SAL','2005-11-01','2005-11-04',100,'ABF',20
union all select 'TWIN','2005-11-01','2005-11-04',102,'ABF',20
union all select 'DBL','2005-11-01','2005-11-04',101,'ABF',20
union all select 'TRP','2005-11-01','2005-11-04',99,'ABF',20

--生成时间列
declare @StartTime as datetime,@EndTime as datetime
select @StartTime=min(StartDate),
@EndTime=max(EndDate) from #T
Create table #Time (dDate datetime) --计算连续时间
while @StartTime<=@EndTime
begin
insert into #Time select @StartTime
set @StartTime=Dateadd(day,1,@StartTime)
end

--动态SQL
declare @StartTime as varchar(20),@EndTime as varchar(20)
select @StartTime=min(StartDate),
@EndTime=max(EndDate) from #T
declare @s1 varchar(500),@s2 varchar(500),@s varchar(2000)
select @s1='',@s2=''
set @s1='select Period=convert(varchar(10),TimeT.dDate,120)+''/''+convert(varchar(10),dateadd(day,1,TimeT.dDate),120)'
select @s1=@s1+','+RID+'=max(case when RID='''+RID+''' then Value1 else NULL end)'
from #T
group by RID
select @s2=@s2+','+Title+'=max(case when Title='''+Title+''' then Value2 else NULL end)'
from #T
group by Title
set @s=@s1+','+stuff(@s2,1,1,'')+' from #T,#Time TimeT where TimeT.dDate<'''+@EndTime+''''
set @s=@s+N' group by convert(varchar(10),TimeT.dDate,120)+''/''+convert(varchar(10),dateadd(day,1,TimeT.dDate),120)'

exec(@s)

--结果
Period DBL SAL TRP TWIN ABF
--------------------- ----------- ----------- ----------- ----------- -----------
2005-11-01/2005-11-02 101 100 99 102 20
2005-11-02/2005-11-03 101 100 99 102 20
2005-11-03/2005-11-04 101 100 99 102 20

--删除测试环境
Drop table #T,#Time
cindyAng 2005-11-01
  • 打赏
  • 举报
回复
也是对称的
cindyAng 2005-11-01
  • 打赏
  • 举报
回复
时间是相同的
zlp321002 2005-11-01
  • 打赏
  • 举报
回复
--如果时间为非对称时间呢??

--给你一个思路,

--时间构造,中间两列动态生成,后面一列,添过来!


--用交叉表就可以了!!

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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