如下我會做到這一點:
- 更換
A
有沒有在這些ID,並將其轉換爲整數
- 寫三篇
SELECT
語句在條件將整數ID在上面的步驟%3中計算得到的值分別爲1,2,0,以產生每一行中的記錄。
- 現在,我們需要加入這三個SELECT語句的結果,如果您使用的是SQL Server 2005,那麼
ROW_NUMBER()
本來就很方便,但由於您使用的是SQL Server 2000,因此您可以使用IDENTITY(INT, 1, 1)
來生成行號這些SELECT語句中的每一行以及此值上的JOIN。
但由於IDENTITY
可以SELECT
僅能使用帶有INTO
條款,你最終會得到包含每列和加入他們的臨時表。
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
我們不能用ID去,ID可一段時間的統計與01A或A001或1A2等... – Gopal
@Gopal,然後您將它們插入IDENTITY列的中間表中,並對該值執行模數運算而不是ID。 – Vikdor