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である条件が、各行のレコードを生成する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
于 2012-10-21T08:42:43.403 に答える