我正在使用SQL Server 2000,我需要列在列中...
我的结果集是这样的..结果集最多可以有11行或更少,然后是11行..
batsman
-----------------
sachin
sahwag
dhoni
kohli
...
...
...
我想要这个:
batsman1 batsman2 batsman3 .....
--------------------------------------------------------
sachin sahwag dhoni .....
另外,有没有办法在SQL Server 2000中声明数组?如果是这样,语法是什么。
答案 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