2010-11-03 88 views
3

標題是可怕的,但這是我能做的最好的。我已經是這樣的:SQL/Knime - Transpose Table with「Group By」

Country Tag Weight 
----------------------- 
1  1  20 
1  2  30 
1  3  77 
2  1  10 
2  2  11 
2  3  100 

或者,在人類可讀的形式:

Country Tag Weight 
----------------------- 
USA  Rock 20 
USA  Pop 30 
USA  Metal 77 
Spain Rock 10 
Spain Pop 11 
Spain Metal 100 

使用SQL(創建視圖)在Knime或數據處理工具,我需要處理數據到這種形式:

Country Rock Pop Metal 
---------------------------- 
USA  20  30 77 
Spain 10  11 100 

從本質上講,標籤項(唯一的)成爲列和國家(唯一的)成爲該行的ID與權重值與自己的國家/標籤貼。

我試過在Knime中能想到的所有東西,並且沒有原始的SQL查詢會引起注意。在Knime中,我成功創建了我想要的矩陣結構(Country x Tag),但我不知道如何填充實際的Weight值,它們都是問號。我的工作解決方案是以我想要的形式將數據簡單地輸出到CSV文件中,而不是輸入到數據庫中。但是,這是klunky和煩人的保持同步。有任何想法嗎?

回答

3

您正在查找pivotcross table。我對Knime沒什麼興趣,但這就是你想用Google搜索的技巧。如果Knime沒有可用的功能,那麼你可能會做得比把這些CSV數據放到MS Excel中並轉換它更糟。

+0

此鏈接建議一個模塊,可以幫助:http://www.knime.org/features – LesterDove 2010-11-03 03:17:59

+1

每當我閱讀數據透視表時,它總是非常專注於聚合。我沒有意識到他們可以解決這樣的問題。一個元素的總和就是這個元素... Duh – colithium 2010-11-03 04:19:08

2

使用ANSI SQL,你會使用:

SELECT t.country, 
     MAX(CASE WHEN t.tag = 'Rock' THEN t.weight END) AS Rock, 
     MAX(CASE WHEN t.tag = 'Pop' THEN t.weight END) AS Pop, 
     MAX(CASE WHEN t.tag = 'Metal' THEN t.weight END) AS Metal 
    FROM YOUR_TABLE t 
GROUP BY t.country 

LesterDove是正確的 - 你一個支點查詢之後是,以行數據轉換成柱狀的數據。

PIVOT(和UNPIVOT)是ANSI語法,但支持滯後一點--SQL Server 2005+,Oracle 11g +是我知道的唯一的。這是次最ANSI /廣泛支持的方法。

+0

不幸的是我正在使用MySQL。我必須自動生成查詢,因爲有大約250個國家和200個標籤。幸運的是,Knime有很好的樞軸支持,我只是沒有意識到它適用於這種情況。 – colithium 2010-11-03 04:42:47

+0

@OMG Pnies:你還可以發佈T-SQL語法嗎?我想有些人可能也對Oracle感興趣。 – PPC 2012-10-09 19:13:27

+0

@PPC:上面的工作在SQL Server,Oracle和PostgreSQL上不加修改。基本上,任何支持'CASE'語法的東西。我已經更新了問題以獲得數據透視標記 - 任何人都可以查找與他們選擇的數據庫的組合,對PIVOT關鍵字的支持相對較新。 – 2012-10-09 23:24:04

2

您可以使用KNIME中的Pivoting節點來執行這個技巧。 只需將「標記」列選作「透視」列,將「國家/地區」列選爲「組」列,然後在「聚合」部分中選擇「權重」列和聚合方法總和。 Bye, Tobias