2009-06-06 63 views
1

在SQL Server 2005中,我有一个表tbl_Info。在那里我有一个专栏说Info。在SQL Server 2005/2000中的行列转换

的值如下

 
Name1 
Age1 
Sex1 
Name2 
Age2 
Sex2 
..... 
..... 
.....

和行值继续这样下去。

我的问题是如何使行col换位。

所需的输出将是

 
Name  Age  Sex 

Name1  Age1  Sex1 
Name2  Age2  Sex2 

.....  ....  ........ 
.....  ....  ........ 

可以使用表变量或临时表。

请不要通过使用程序集提供解决方案。因为我已经通过使用程序集来做到这一点,但我想要一个我甚至可以在SQL Server 2000中使用的解决方案。

+0

看起来像作业。 – 2009-06-06 14:41:07

回答

1

总的想法是,你需要另一列,以保证订单 - 这是典型的将是一些整数类型的主键,而是让事情简单说,我们只需要使用:

CREATE TABLE foo (ord INT, col VARCHAR) 

ord刚插入为0,1,2,等

现在,你想要的SELECT是:

SELECT a.col AS Name, b.col AS Age, c.col AS Sex 
    FROM foo AS a 
    JOIN foo AS b ON(b.ord=1+a.ord) 
    JOIN foo AS c ON(c.ord=2+a.ord) 
    WHERE a.ord%3=0 

这将只是工作关于_a可以称之为“SQL”的那些东西;-)。

例如,当数据是:

ord col 
    0 John 
    1 23 
    2  M 
    3 Mary 
    4 21 
    5  F 
    6 Karl 
    7 25 
    8  M 

上述SELECT的结果是:

Name Age Sex 
John 23  M 
Mary 21  F 
Karl 25  M 
+0

我不能使用任何其他列。数据库模式中已经存在一些限制!否则我肯定会采取你的解决方案。 – 2009-06-07 01:32:25

+0

如果你只有一列,没有什么能保证你的顺序是你想要的。如果你幸运的话,你可能会找到一种方法来综合你所需要的排序列 - 但单列表将永远不会有任何强健的内在顺序(除非你可以通过订购那一列列,这绝对不是你所需要的),所以任何这样的解决方案都会非常脆弱以至于几乎无用。祝你好运,你会需要它(尤其是如果你必须尊重一个完全忽略关系数据库的每个原则的模式!)。 – 2009-06-07 01:55:19

0

您想要pivot表。通常情况下,您至少需要两列(一个用于一个键,另一个用于一个值),您通常还需要事先知道您在结果中预期的列。

+0

我很抱歉地说,但你不能使用聚合函数。 枢轴需要一个聚合函数 – 2009-06-06 14:44:55