私はそれを次のようにします:
- AそれらのIDを何も置き換えずに、整数に変換します
- SELECT上記のステップ%3で計算された整数IDがそれぞれ1、2、0である条件が、各行のレコードを生成する3つのステートメントを記述します。
- ここで、これら3つのSELECTステートメントの結果を結合する必要があります。SQLServer2005を使用しROW_NUMBER()ている場合は便利ですが、SQL Server 2000を使用IDENTITY(INT, 1, 1)しているため、これらのSELECTの各行の行番号を生成するために使用します。ステートメントとこの値のJOIN。
ただし、with句でのみIDENTITY使用できるため、各列を含み、それらを結合する一時テーブルになります。SELECTINTO
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以降を使用している場合、これはすべて、次のように1つのクエリで実行できます。
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