行转列问题

GritH2O 2010-10-28 01:21:58
表1 t1
id name age
1 aa 22
2 bb 33
3 cc 30
4 dd 31

表2 t2
id adate meno
1 2002-1-1 s1
2 2002-1-1 s3
1 2002-1-1 s7
3 2003-1-1 s4
1 2003-1-1 s2
2 2004-1-1 s5
3 2004-1-1 s6

结果
id name age 2002-1-1 2002-1-1 2003-1-1 2004-1-1
1 aa 22 s1 s7 s2
2 bb 33 s3 s5
3 cc 30 s4 s6
4 dd 31

结果的列是根据表2的数据自动生成的 如果表2添加数据则结果中列增加
注意结果中的列有重复的
想要得到这个结果集,不知道弄
...全文
47 点赞 收藏 8
写回复
8 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
abuying 2010-10-28
[Quote=引用 7 楼 grith2o 的回复:]

请问你 你的那个px是什么?
[/Quote]
就是新的结果集的重新编号,类似于idenity(int ,1,1)
回复
GritH2O 2010-10-28
请问你 你的那个px是什么?
回复
GritH2O 2010-10-28
我考 结果怎么就发不上来呢?
位置总是不对
回复
GritH2O 2010-10-28

结果
id name age 2002-1-1 2002-1-1 2003-1-1 2004-1-1
1 aa 22 s1 s7 s2
2 bb 33 s3 s5
3 cc 30 s4 s6
4 dd 31
回复
dawugui 2010-10-28
--sql 2000静态
select t1.* ,
max(case px when 1 then meno else '' end) date1,
max(case px when 2 then meno else '' end) date2,
max(case px when 3 then meno else '' end) date3
from t1 ,
(select t.* , px = (select count(1) from t2 where id = t.id and adate < t.adate) = 1 from t2 t) m
where t1.id = m.id
group by t1.id , t1.name , t1.meno

--sql 2000动态
declare @sql varchar(8000)
set @sql = 'select t1.* '
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then meno else '''' end) [date' + cast(px as varchar) + ']'
from (select distinct px from (select t.* , px = (select count(1) from t2 where id = t.id and adate < t.adate) = 1 from t2 t) m ) as a
set @sql = @sql + ' from t1 ,
(select t.* , px = (select count(1) from t2 where id = t.id and adate < t.adate) = 1 from t2 t) m
where t1.id = m.id
group by t1.id , t1.name , t1.meno'
exec(@sql)
回复
GritH2O 2010-10-28

<table width="381" border="1">
<tr>
<td width="14">id</td>
<td width="28">name</td>
<td width="21">age</td>
<td width="69">2002-1-1</td>
<td width="65">2002-1-1</td>
<td width="67">2003-1-1</td>
<td width="71">2004-1-1</td>
</tr>
<tr>
<td>1</td>
<td>aa</td>
<td>22</td>
<td>s1</td>
<td>s7</td>
<td>s2</td>
<td> </td>
</tr>
<tr>
<td>2</td>
<td>bb</td>
<td>33</td>
<td>s3</td>
<td> </td>
<td> </td>
<td>s5</td>
</tr>
<tr>
<td>3</td>
<td>cc</td>
<td>30</td>
<td> </td>
<td> </td>
<td>s4</td>
<td>s6</td>
</tr>
<tr>
<td>4</td>
<td>dd</td>
<td>31</td>
<td> </td>
<td> </td>
<td> </td>
<td> </td>
</tr>
</table>
回复
dawugui 2010-10-28
你这个行列转换,数据恐怕有问题吧。
建议改为:
id name age date1 date2 date3 date4
1 aa 22 s1 s7 s2
2 bb 33 s3 s5
3 cc 30 s4 s6
4 dd 31
回复
GritH2O 2010-10-28
结果
id name age 2002-1-1 2002-1-1 2003-1-1 2004-1-1
1 aa 22 s1 s7 s2
2 bb 33 s3 s5
3 cc 30 s4 s6
4 dd 31
回复
相关推荐
发帖
疑难问题
创建于2007-09-28

2.1w+

社区成员

MS-SQL Server 疑难问题
申请成为版主
帖子事件
创建了帖子
2010-10-28 01:21
社区公告
暂无公告