列数据转化为行数据

Alden 2012-01-20 12:27:04
Table1
Key Start End
1 2010-01-01 2010-12-31
2 2011-01-01 2011-12-31

Table2
Key Date Flag
1 2010-01-01 0(start)
2 2010-12-31 1(end)
3 2011-01-01 0(start)
4 2011-12-31 1(end)

如何将Table1的数据转化为Table2格式
...全文
136 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Alden 2012-01-20
  • 打赏
  • 举报
回复
谢谢,我知道这样写可以,但是能不能通过一个select完成,使用两次select, performance怕是不好吧
唐诗三百首 2012-01-20
  • 打赏
  • 举报
回复

create table Table1
(keys int, startd date, endd date)

insert into Table1
select '1', '2010-01-01', '2010-12-31' union all
select '2', '2011-01-01', '2011-12-31'


select row_number() over(order by t.dates) keys,
t.dates, t.Flag
from
(select startd dates,0 Flag from Table1
union all
select endd dates,1 Flag from Table1) t

keys dates Flag
-------------------- ---------- -----------
1 2010-01-01 0
2 2010-12-31 1
3 2011-01-01 0
4 2011-12-31 1

(4 row(s) affected)
tjs_125 2012-01-20
  • 打赏
  • 举报
回复
对升级到 SQL Server 2005 或更高版本的数据库使用 PIVOT 和 UNPIVOT 时,必须将数据库的兼容级别设置为 90 或更高。
tjs_125 2012-01-20
  • 打赏
  • 举报
回复
/*
Key Date Flag
-------------------- ----------------------- --------
1 2010-01-01 00:00:00.000 0(start)
2 2010-12-31 00:00:00.000 1(end)
3 2011-01-01 00:00:00.000 0(start)
4 2011-12-31 00:00:00.000 1(end)

(4 行受影响)
*/
tjs_125 2012-01-20
  • 打赏
  • 举报
回复
if object_id( 'Table1') is not null
Drop Table Table1
create table Table1(
keys int
,startD datetime
,endD datetime)
insert into Table1(keys, startD, endD)
select 1, '2010-01-01', '2010-12-31' union all
select 2, '2011-01-01', '2011-12-31'

select [Key]=Row_number()OVER(ORDER BY b.keys, b.date),
[Date] = b.date,
Flag =(case
when b.aflag = 'startD' then '0(start)'
when b.aflag = 'endD' then '1(end)' end)
from Table1 a
unpivot
( date for aflag
in (startD, endD)
)as b

34,590

社区成员

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

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