2008年10月8日 星期三

[SQL] Table Rotation(資料表旋轉)

看到主題你多少會感到很酷!因為 table 也可以旋轉喔?那麼神奇~

沒錯,如果你經常對於 table 要下 query,偏偏 table 又不是你設計(如果是你設計的那就活該啦XD),你可能會看到項這種的 table:

id type value
王大名 A 100
王大名 B 50
李大砲 A 40
李大砲 C 60
陳一二 D 20

 

這時候你想要整理出一個 table 如下:

id A B C D
王大名 100 50 NULL NULL
李大砲 40 NULL 60 NULL
陳一二 NULL NULL NULL 20

 

這時候你就會需要 table rotation 囉!有沒有一點感覺啦~由上面的 table 要改成下面的 table,就好像資料表做了旋轉的感覺。

回歸到 SQL 語法層面,我們該怎樣去作勒?若你是用 MS SQL 2005 那你可以鬆一口氣了!因為他有新的語法可以支援這樣的 table rotation - PIVOT and UNPIVOT。不過這裡不討論這兩種語法,我們要用最純粹的、最傳統、最正港的 SQL 語法來兜。

先假設第一個 table 就做 table Test,所以我們要取出成第二個 table 的樣式,所以我們在 SELECT 中一定會出現 id,A,B,C,D 的東西:

SELECT id,A,B,C,D

FROM test

因為 id 本來舊屬於 test Table 的資料,所以我們的目標就會在 A,B,C,D 這四個 column。如果我們要取出 column A 那我們就是要去取 test Table 中 type=A 的資料,所以目標很清楚,我們要在上面的 SQL 中在加入 sub-select:

SELECT id,

  A=(SELECT value FROM test WHERE type='A'),...

FROM test

這樣看似完成了,不過還是差一點,因為我們並沒有指定說是要誰的 A 值!所以要將其改成

SELECT T.id,

  A = (SELECT value FROM test WHERE type='A' AND id=T.id),

  B = (SELECT value FROM test WHERE type='B' AND id=T.id),..

FROM test AS T

GROUP BY T.id

哇!這樣就完成了~其實思考的過程並不難,重點是要知道 sub-select 的運用。

沒有留言: