如何将行拆分为列

时间:2012-10-21 08:23:42

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

使用SQL Server 2000

表1

ID

A001
A002
A003
A004
A005
A006
A007
....
....
A028

从上表中,我想将3行拆分为3列,按id

排序

行显示如下

预期产出

id1 id2 id3

A001 A002 A003
A004 A005 A006
A007 A008 A009
...
...
A025 A026 A027
A028 null null

ID不是固定的,ID也可能包含这样的内容(01A or A001 or 1A1 or etc....

表1行数不固定,也可能超过100行。第3列是固定的。如何查询上述条件。

需要查询帮助

1 个答案:

答案 0 :(得分:2)

我会这样做:

  • A替换为这些ID中的任何内容并将其转换为整数
  • 编写三个SELECT语句,其中条件将是上面步骤%3中计算的整数ID,分别为1,2,0,以产生每行中的记录。
  • 现在,我们需要加入这三个SELECT语句的结果,如果你在SQL Server 2005上,那么ROW_NUMBER()本来就很方便,但是因为你在SQL Server 2000上,你会使用{{ 1}}为这些SELECT语句中的每一行生成行号,并为此值生成JOIN。

但由于IDENTITY(INT, 1, 1)只能在IDENTITY中使用SELECT子句,因此您最终会得到包含每列的临时表并加入它们。

INTO

如果您使用的是SQL Server 2005或更高版本,则可以在单个查询中完成所有这些操作,如下所示:

SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row1 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 1

SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row2 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 2

SELECT IDENTITY(INT, 1, 1) AS 'RowNum', ID FROM INTO #Row3 Table1
WHERE CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 0

SELECT 
    r1.ID id1,
    r2.ID id2,
    r3.ID id3
FROM
    #Row1 r1
    FULL OUTER JOIN #Row2 r2
    ON r1.RowNum = r2.RowNum
    FULL OUTER JOIN #Row3 r3
    ON r3.RowNum = r3.RowNum

DROP TABLE #Row1
DROP TABLE #Row2
DROP TABLE #Row3