行列转换后排序问题

微量科技 2006-07-13 10:02:47
表Tab
字段:
Co1 Co2 Co3
a1 ccc p500
a1 fff p300
a1 eee p600
a2 ccc p200
a2 fff p100
a2 eee p300
....

要求转换后的记录集的第2、第3、第4列顺序要和Tab表中Co2列排序一样,先ccc,然后fff,再eee 如下:
Co1 ccc fff eee
a1 p500 p300 p600
a2 p200 p100 p300
....




...全文
239 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
微量科技 2006-07-13
  • 打赏
  • 举报
回复
问题按鱼兄的写发解决!结贴
微量科技 2006-07-13
  • 打赏
  • 举报
回复
感谢鱼兄与楼上的!
fcuandy 2006-07-13
  • 打赏
  • 举报
回复
跟昨天这个有点类似.

http://community.csdn.net/Expert/topic/4875/4875601.xml?temp=.5562403
fcuandy 2006-07-13
  • 打赏
  • 举报
回复
不过按鱼的写法是可以的.
fcuandy 2006-07-13
  • 打赏
  • 举报
回复
Co1 Co2 Co3
a1 kkk p500
a1 fff p300
a1 eee p600
a2 ccc p200
a2 fff p100
a2 eee p300
....

要得到如下结果:
Co1 kkk ccc fff eee
a1 p500 null p300 p600
a2 null p200 p100 p300
-------------------------------------------

照你的想法,数据继续增多

a2 mmm p303
a2 vvv p302
a2 xxx p301
那么结果是?
Co1 kkk ccc fff eee mmm vvv xxx
a1 p500 null p300 p600 null null null
a2 null p200 p100 p300 p303 p302 p301

我假设不排顺序.
也即,是否每个值都要转成列?

如果是,你的想法太理想化了.
paoluo 2006-07-13
  • 打赏
  • 举报
回复
再借用一個臨時表

Create Table Tab
(Co1 Varchar(10),
Co2 Varchar(10),
Co3 Varchar(10))
Insert Tab Select 'a1', 'kkk', 'p500'
Union All Select 'a1', 'fff', 'p300'
Union All Select 'a1', 'eee', 'p600'
Union All Select 'a2', 'ccc', 'p200'
Union All Select 'a2', 'fff', 'p100'
Union All Select 'a2', 'eee', 'p300'
GO
Select ID=Identity(Int,1,1),* Into #T From Tab
Select *,IDCount=(Select Count(*) From #T Where Co1=A.Co1 And ID<=A.ID) Into # From #T A

Declare @S Varchar(8000)
Select @S=''
Select @S=@S+',Max(Case Co2 When '''+Co2+''' Then Co3 Else '''' End) As '+Co2
From # Group By Co2 Order By Min(IDCount),Min(Co1)
Select @S='Select Co1'+@S+' From Tab Group By Co1'
EXEC(@S)

Drop Table #T,#
GO
Drop Table Tab
--Result
/*
Co1 kkk ccc fff eee
a1 p500 p300 p600
a2 p200 p100 p300
*/
微量科技 2006-07-13
  • 打赏
  • 举报
回复
写错了是ccc改成kkk
微量科技 2006-07-13
  • 打赏
  • 举报
回复
感谢鱼兄,不过还有个问题,就是a1记录中的ccc改成bbb如下
字段:
Co1 Co2 Co3
a1 kkk p500
a1 fff p300
a1 eee p600
a2 ccc p200
a2 fff p100
a2 eee p300
....

要得到如下结果:
Co1 kkk ccc fff eee
a1 p500 null p300 p600
a2 null p200 p100 p300
....


转换后的记录集的第2、第3、第4列、第5列顺序还是和Tab表中Co2列排序一样,先kkk,然后ccc,然后fff,再eee
paoluo 2006-07-13
  • 打赏
  • 举报
回复
--如果沒有明顯的可以用來排序的列,就借用臨時表了
Create Table Tab
(Co1 Varchar(10),
Co2 Varchar(10),
Co3 Varchar(10))
Insert Tab Select 'a1', 'ccc', 'p500'
Union All Select 'a1', 'fff', 'p300'
Union All Select 'a1', 'eee', 'p600'
Union All Select 'a2', 'ccc', 'p200'
Union All Select 'a2', 'fff', 'p100'
Union All Select 'a2', 'eee', 'p300'
GO
Select ID=Identity(Int,1,1),* Into #T From Tab

Declare @S Varchar(8000)
Select @S=''
Select @S=@S+',Max(Case Co2 When '''+Co2+''' Then Co3 Else '''' End) As '+Co2
From #T Group By Co2 Order By Min(ID)
Select @S='Select Co1'+@S+' From Tab Group By Co1'
EXEC(@S)

Drop Table #T
GO
Drop Table Tab
--Result
/*
Co1 ccc fff eee
a1 p500 p300 p600
a2 p200 p100 p300
*/

34,590

社区成员

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

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