我会这样做:
- 替换
A
这些 ID 中的任何内容并将它们转换为整数
- 写三个
SELECT
语句,条件是上面步骤 %3 中计算的整数 ID 分别为 1、2、0,以产生每一行中的记录。
- 现在,我们需要 JOIN 这三个 SELECT 语句的结果,如果您使用的是 SQL Server 2005,那么
ROW_NUMBER()
会很方便,但由于您使用的是 SQL Server 2000,因此您将使用IDENTITY(INT, 1, 1)
这些 SELECT 中的每一行生成行号声明并加入这个值。
但是由于IDENTITY
只能在SELECT
withINTO
子句中使用,因此您最终会得到包含每列并加入它们的临时表。
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