如何在SQL Server 2000中将行转换为列

时间:2011-04-27 03:50:47

标签: sql-server sql-server-2000 pivot

  

可能重复:
  Pivot using SQL Server 2000

我正在使用SQL Server 2000,我需要列在列中...

我的结果集是这样的..结果集最多可以有11行或更少,然后是11行..

batsman
-----------------
sachin
sahwag
dhoni
kohli
...
...
...

我想要这个:

batsman1      batsman2      batsman3    .....
--------------------------------------------------------
sachin        sahwag        dhoni       .....

另外,有没有办法在SQL Server 2000中声明数组?如果是这样,语法是什么。

2 个答案:

答案 0 :(得分:1)

通常,您完成此操作的方法是使用Case语句。首先,我认为你声称你拥有的是一个名为Batsmans的列表,如下所示:

Batsmans
-------
Sachin
Sahwag
Dhoni
Kohli

您寻求的通常称为交叉表查询。以下示例适用于大多数数据库产品:

Select Min( Case When Batsmans = 'Sachin' Then Batsmans End ) As Batsman1
    , Min( Case When Batsmans = 'Sahwag' Then Batsmans End ) As Batsman2
    , Min( Case When Batsmans = 'Dhoni' Then Batsmans End ) As Batsman3
    ...
From MyTable

这将产生一行。请注意,列是静态设置的,您想要的是第一个,第二个,第三个等。出于这个原因,这通常称为静态交叉表。如果您希望系统动态构建列,您应该在中间层代码中的T-SQL之外构建那种查询。

如果您的表格包含Batsmans的位置,那么您可以使用它来构建查询

Position | Batsmans
---------  -------- 
1        | Sachin
2        | Sahwag
3        | Dhoni
4        | Kohli
Select Min( Case When Position = 1 Then Batsmans End ) As Batsman1
    , Min( Case When Position = 2 Then Batsmans End ) As Batsman2
    , Min( Case When Position = 3 Then Batsmans End ) As Batsman3
    ...
From MyTable

答案 1 :(得分:0)

不幸的是,sql server 2000中没有'pivot'。所以你必须手动转动它。知道你是否确切地拥有确切的行数应该会让这更容易,并且你可以遵循静态交叉表方法 - 但你说你不知道是否总会有11行(尽管,在板球队中,你总应该有11 :)。但试试这个 - 我在一个名为'batsmen'的表中对此进行了测试,如下所示。虽然不建议使用游标,但知道最多有11行,这是可以接受的。


ID          batsman         
----------- --------------------------------------------------
1           sachin
2           dhoni
3           sehwag



declare @id int
declare @batsman varchar(100)
declare @sqlStatment varchar(8000)
declare @counter int

declare getEm cursor local  for select ID, batsman from batsmen
set @sqlStatment = ''
set @counter = 1

open getEm
        while (1=1)
        begin
                 fetch next from getEm into @id, @batsman

                 if (@@fetch_status  0)
                    begin
                DEALLOCATE getEm
                break
                    end


              set @sqlStatment = @sqlStatment + '''' + @batsman + '''' + ' as batsman' + CAST(@counter as varchar(2)) + ','
              set @counter = @counter + 1   


        end


set @sqlStatment = 'select ' + LEFT(@sqlStatment,LEN(@sqlStatment)-1)

exec (@sqlStatment)

这个输出是:


batsman1 batsman2 batsman3
-------- -------- --------
sachin   dhoni    sehwag