2012-10-21 27 views
3

使用SQL Server 2000如何對行分成列

表1

ID 

A001 
A002 
A003 
A004 
A005 
A006 
A007 
.... 
.... 
A028 

從上面的表中,我想通過id

行的顯示等向3行分割成3列,爲了此

預期輸出

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列是固定的。如何查詢上述條件。

需要查詢幫助

回答

2

如下我會做到這一點:

  • 更換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 
+0

我們不能用ID去,ID可一段時間的統計與01A或A001或1A2等... – Gopal

+0

@Gopal,然後您將它們插入IDENTITY列的中間表中,並對該值執行模數運算而不是ID。 – Vikdor