【问题标题】:How to convert rows into column in SQL Server 2000 [duplicate]如何在 SQL Server 2000 中将行转换为列 [重复]
【发布时间】:2011-04-27 03:50:46
【问题描述】:

可能重复:
Pivot using SQL Server 2000

我使用的是 SQL Server 2000,我需要将行放在列中...

我的结果集是这样的..结果集最多可以有 11 行或少于 11 行..

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

我想要这个:

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

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

【问题讨论】:

  • 这个问题涵盖了同样的问题(我认为):stackoverflow.com/questions/312861/pivot-using-sql-server-2000
  • 另外,SQL Server 中没有数组。研究使用表变量。它是 SQL Server 中最接近的。
  • 这很容易做到,但您需要向我们展示一些示例数据或重新格式化您的示例以使其有意义。向我们展示结果集中应转换为列的 5-10 行。期望结果中只有一行还是多行?
  • @rsbarro - 在那个问题中“A B C”是固定的,但在我的问题中,球员的名字因球队而异..所以我无法理解如何在我的问题中使用这种类型..
  • 我试图格式化我的示例,但我未能显示我的数据是行和列... batsmans 在行...和 ​​batsman1,batsman2,batsman3,batsman4,..... 是列..

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


【解决方案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 之外构建这种查询。

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

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

【讨论】:

    【解决方案2】:

    不幸的是,sql server 2000 中没有“pivot”。所以你必须手动旋转它。知道你是否有确切的行数应该会让这更容易,你可以遵循静态交叉表方法 - 但你说你不知道是否总是有 11 行(尽管在板球队中,你总是应该有 11 :)。但是试试这个 - 我在一个名为“击球手”的表格中测试了这个,如下所示。尽管不推荐使用游标,但知道您最多可以有 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-19
      • 2010-09-14
      • 1970-01-01
      • 2020-11-14
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多