2012-07-11 98 views
4

創建一個矩陣,地理數據記錄是這樣的:如何使用SQL

START     | END 

CITY1 | STATE1 | CITY2 | STATE2 
---------------------------------------------- 
New York | NY  | Boston | MA 
Newark | NJ  | Albany | NY 
Cleveland| OH  | Cambridge | MA 

我想輸出是這樣重要的地方顯示爲矩陣開始/結束配對:

| MA | NJ | NY | OH 
------------------------------ 
MA | 0 | 0 | 1 | 0 
NJ | 0 | 0 | 1 | 0 
NY | 1 | 0 | 0 | 0 
OH | 1 | 0 | 0 | 0 

我可以看到GROUP BYCOUNT將如何查找數據,但我失去了如何顯示爲矩陣。有沒有人有任何想法?

+1

您正在使用哪種RDBMS? – Flimzy 2012-07-11 23:36:40

+0

MS SQL Server 2008 – greener 2012-07-11 23:45:55

回答

3

這似乎是訣竅,在PostgreSQL 9.1上測試過。它幾乎肯定需要適應SQL Server(任何人都可以隨時更新我的​​答案)。

SELECT start AS state, 
    SUM((dest = 'MA')::INT) AS MA, 
    SUM((dest = 'NJ')::INT) AS NJ, 
    SUM((dest = 'NY')::INT) AS NY, 
    SUM((dest = 'OH')::INT) AS OH 
FROM (
    SELECT state1 AS start, state2 AS dest 
     FROM routes 
    UNION ALL 
    SELECT state2 AS start, state1 AS dest 
     FROM routes 
) AS s 
GROUP BY start 
ORDER BY start; 

但是請注意,我的輸出略有不同比你 - 我不知道這是因爲你的樣本輸出是錯誤的,或者是因爲我誤解你的要求:

state | ma | nj | ny | oh 
-------+----+----+----+---- 
MA | 0 | 0 | 1 | 1 
NJ | 0 | 0 | 1 | 0 
NY | 1 | 1 | 0 | 0 
OH | 1 | 0 | 0 | 0 
(4 rows) 

這個查詢作品通過查詢表兩次,一次查詢state1 - > state2路由,第二次查詢state2 - > state1路由,然後將它們與UNION ALL一起加入。

然後,對於每個目標狀態,它爲該行的原始狀態運行SUM()

這個策略應該很容易適應任何RDBMS。

+2

謝謝。這工作。在SQL中:SUM(如果dest ='MA'那麼1 ELSE 0 END)作爲MA'。儘管如此,有沒有辦法避免編寫每個'SUM',否則有50行? – greener 2012-07-12 00:19:52

+1

我不認爲有什麼辦法可以避免這種情況......寫入存儲過程或函數可能是個例外。 – Flimzy 2012-07-12 00:28:02

+0

@Flimzy:+1爲好的解決方案 – 2012-07-12 07:08:45