行转列问题,sorry,实在没有搜索到合适的答案,请大家帮忙。

mostice 2009-03-19 05:59:56
原始数据如下:
rowno 管理编号 序号 区分 所属编号
2 10000000001 4 2 1777
1 10000000001 5 2 2000
2 10000000002 3 2 2000
1 10000000002 4 2 2875
1 90000000001 1 9 2000
1 90000000002 1 9 2000
1 90000000003 1 9 2000
1 90000000004 1 9 2000
期望结果:
管理编号 NEW编号 OLD编号
10000000001 2000 1777
10000000002 2875 2000
90000000001 1 9
90000000002 1 9
90000000003 1 9
90000000004 1 9
本地测试一直得不到上面这样的结果,请大家帮忙。谢谢!
...全文
125 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
wenblue7 2009-03-19
  • 打赏
  • 举报
回复
我都很强啊
up
ai_li7758521 2009-03-19
  • 打赏
  • 举报
回复
select 
a.管理编号,
max(isnull(cast((case rowno when 1 then a.所属编号 end)as nvarchar),'')) as NEW编号,
max(isnull(cast((case rowno when 2 then a.所属编号 end)as nvarchar),'')) as OLD编号
from tb a
group by 管理编号

/*
管理编号 NEW编号 OLD编号
----------- ------------------------------ ------------------------------
10000000001 2000 1777
10000000002 2875 2000
90000000001 2000
90000000002 2000
90000000003 2000
90000000004 2000

(6 行受影响)

*/
ai_li7758521 2009-03-19
  • 打赏
  • 举报
回复
select 
a.管理编号,
max(case rowno when 1 then a.所属编号 end) as NEW编号,
max(case rowno when 2 then a.所属编号 end) as OLD编号
from tb a
group by 管理编号

/*
管理编号 NEW编号 OLD编号
----------- ----------- -----------
10000000001 2000 1777
10000000002 2875 2000
90000000001 2000 NULL
90000000002 2000 NULL
90000000003 2000 NULL
90000000004 2000 NULL
警告: 聚合或其他 SET 操作消除了空值。

(6 行受影响)

*/
sdhdy 2009-03-19
  • 打赏
  • 举报
回复
是根据rowno 判断吗?不会吧。
sdhdy 2009-03-19
  • 打赏
  • 举报
回复


create table test(rowno int, 管理编号 varchar(20), 序号 int, 区分 int, 所属编号 int)
go
insert test select 2, '10000000001', 4, 2, 1777
insert test select 1, '10000000001', 5 ,2 ,2000
insert test select 2, '10000000002', 3, 2 ,2000
insert test select 1, '10000000002', 4, 2, 2875
insert test select 1, '90000000001', 1 ,9, 2000
insert test select 1, '90000000002', 1 ,9 ,2000
insert test select 1, '90000000003', 1, 9 ,2000
insert test select 1, '90000000004', 1, 9 ,2000
go
select a.管理编号,a.NEW编号,a.OLD编号 from (select 管理编号,区分,min(所属编号) OLD编号 ,max(所属编号) NEW编号 from test group by 管理编号,区分) a where a.OLD编号<>a.NEW编号
union all
select 管理编号,序号,区分 from test a where not exists(select 1 from test where 管理编号=a.管理编号 and 区分=a.区分 and (所属编号>a.所属编号 or 所属编号<a.所属编号))
go
/*
管理编号 NEW编号 OLD编号
-------------------- ----------- -----------
10000000001 2000 1777
10000000002 2875 2000
90000000001 1 9
90000000002 1 9
90000000003 1 9
90000000004 1 9

*/
drop table test
go
百年树人 2009-03-19
  • 打赏
  • 举报
回复
...
子陌红尘 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 mostice 的回复:]
谢谢大家,基本搞定,
我是这样写的,大家看看与楼上 libin_ftsafe 是否有分别?
select
a.管理编号,
(case when b.rowno is null then a.序号 else a.所属编号 end) as NEW编号,
(case when b.rowno is null then a.区分 else b.所属编号 end) as OLD编号
from
@t
group by 管理编号

不晓得是不是脑袋短路,1个小时前说什么都执行不成功,后来终于找到哪里错了。
[/Quote]

粗略看来,楼主的SQL自然是不行,既然是对单表统计,a和b的别名又从何而来?
mostice 2009-03-19
  • 打赏
  • 举报
回复
谢谢大家,基本搞定,
我是这样写的,大家看看与楼上 libin_ftsafe 是否有分别?
select
a.管理编号,
(case when b.rowno is null then a.序号 else a.所属编号 end) as NEW编号,
(case when b.rowno is null then a.区分 else b.所属编号 end) as OLD编号
from
@t
group by 管理编号

不晓得是不是脑袋短路,1个小时前说什么都执行不成功,后来终于找到哪里错了。
子陌红尘 2009-03-19
  • 打赏
  • 举报
回复

declare @t table(rowno int,管理编号 varchar(16),序号 int,区分 int,所属编号 int)
insert into @t select 2,'10000000001',4,2,1777
insert into @t select 1,'10000000001',5,2,2000
insert into @t select 2,'10000000002',3,2,2000
insert into @t select 1,'10000000002',4,2,2875
insert into @t select 1,'90000000001',1,9,2000
insert into @t select 1,'90000000002',1,9,2000
insert into @t select 1,'90000000003',1,9,2000
insert into @t select 1,'90000000004',1,9,2000


select
a.管理编号,
(case when b.rowno is null then a.序号 else a.所属编号 end) as NEW编号,
(case when b.rowno is null then a.区分 else b.所属编号 end) as OLD编号
from
(select * from @t where rowno=1) a
left join
(select * from @t where rowno=2) b
on
a.管理编号=b.管理编号

/*
管理编号 NEW编号 OLD编号
---------------- ----------- -----------
10000000001 2000 1777
10000000002 2875 2000
90000000001 1 9
90000000002 1 9
90000000003 1 9
90000000004 1 9
*/
liangCK 2009-03-19
  • 打赏
  • 举报
回复
[Quote=引用楼主 mostice 的帖子:]
原始数据如下:
rowno 管理编号 序号 区分 所属编号
2 10000000001 4 2 1777
1 10000000001 5 2 2000
2 10000000002 3 2 2000
1 10000000002 4 2 2875
1 90000000001 1 9 2000
1 90000000002 1 9 2000
1 90000000003 1 9 2000
1 90000000004 1 9 2000
期望结果:
管理编号 NEW编号 OLD编号
10000000001 2000 1777
10000000002 2875 2000
90000000001 1 9
90000000002 1 9
90000000003 1 9
90000000004 1 9
本地测试一直得不到上面这样的结果,请大家帮忙。谢谢! [/Quote]

这又是怎么得出来的?
mostice 2009-03-19
  • 打赏
  • 举报
回复
sorry ,我以为上面的原始数据已经很清晰了。

管理编号 所在的 ROWNO
如果是1,则 NEW编号 = 所属编号
如果是2,则 OLD编号 = 所属编号
条件:
ROWNO 只有 1 和 2.
mostice 2009-03-19
  • 打赏
  • 举报
回复
sorry ,我以为上面的原始数据已经很清晰了。

管理编号 所在的 ROWNO
如果是1,则 NEW编号 = 所属编号
如果是2,则 OLD编号 = 所属编号
条件:
ROWNO 只有 1 和 2.
小雨点 2009-03-19
  • 打赏
  • 举报
回复
按【交叉表】的思路办!祝成功!
stg609 2009-03-19
  • 打赏
  • 举报
回复
NEW编号 OLD编号 是根据什么划分的?
liangCK 2009-03-19
  • 打赏
  • 举报
回复
规律也得说说吧?就这样放出来让人猜?

22,210

社区成员

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

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