3

使用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 列是固定的。如何查询上述条件。

需要查询帮助

4

1 回答 1

2

我会这样做:

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

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

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

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

SELECT 
    R1.ID,
    R2.ID,
    R3.ID
FROM 
    (
        SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNum, ID 
        FROM ATABLE 
        WHERE 
            CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 1
    ) AS R1
    FULL OUTER JOIN (
        SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNum, ID 
        FROM ATABLE 
        WHERE 
            CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 2
    ) AS R2
    ON R1.RowNum = R2.RowNum
    FULL OUTER JOIN (
        SELECT ROW_NUMBER() OVER (ORDER BY ID ASC) AS RowNum, ID 
        FROM ATABLE 
        WHERE 
            CONVERT(INT, REPLACE(ID, 'A', '')) % 3 = 0
   ) AS R3
    ON R2.RowNum = R3.RowNum
于 2012-10-21T08:42:43.403 回答