看到主題你多少會感到很酷!因為 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 的運用。
沒有留言:
張貼留言