日期:2014-05-19  浏览次数:20384 次

★★★★★★★★★★★★★★★★★★一个简单的查询语句,却不能简单的写出来■■■■■■■■■■■■■■■■■■■■■■■■■■■
表1
a     b
1   2
1   3
1   4
2   5
2   6
3   7
3   8
3   9
想要的结果
列1   列2   列3
  1       1       1
2         2       null
3         3       3

------解决方案--------------------
up
关注
------解决方案--------------------
其实不是太难
在创建新的一例c
字段的内容和a相同
然后
把c和b做成交叉表
那么转化之后c列下面的内容就是a
交叉表例子很多
有动态的也有静态的
这样问题解决
------解决方案--------------------
create table TT1(
a int,
b int
)
insert TT1 select
1, 2
union all select
1, 3
union all select
1, 4
union all select
2, 5
union all select
2, 6
union all select
3, 7
union all select
3, 8
union all select
3, 9

go

declare @t table(
a int,
id int
)


declare @Max int
select top 1 @Max=count(*) from TT1 group by a order by count(*) desc

declare @sql varchar(8000)
set @sql= ' '
declare @sql1 varchar(8000)
set @sql1= ' '
declare @i int
set @i=1
while @i <=@Max
begin
set @sql1=@sql1+ ',max([列 '+cast(@i as varchar)+ ']) as [列 '+cast(@i as varchar)+ '] '

set @sql=@sql+ ',case when (select count(*) from TT1 where a=t.a and b <=t.b)= '+cast(@i as varchar)+ ' then a end as [列 '+cast(@i as varchar)+ '] '
set @i=@i+1
end
set @sql1=stuff(@sql1,1,1, ' ')

exec( 'select ' + @sql1+ 'from ( select a '+@sql+ ' from TT1 t) as t1 group by a ')


drop table TT1

--结果
列1 列2 列3
----------- ----------- -----------
1 1 1
2 2 NULL
3 3 3

警告: 聚合或其它 SET 操作消除了空值。