SQL / Knime - 使用“分组依据”转置表

时间:2010-11-03 03:03:17

标签: mysql sql pivot knime

标题很可怕,但这是我能做的最好的。我所拥有的是这样的:

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

在Knime中使用SQL(创建视图)或数据操作工具,我需要将数据操作为这种形式:

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

基本上,标记条目(唯一的)成为列,国家(唯一的)成为行ID,其权重值与其国家/标记一致。

我已经尝试了我在Knime中可以想到的一切,并且没有想到原始的SQL查询。在Knime中,我成功创建了我想要的矩阵结构(Country x Tag),但我不知道如何填充实际的Weight值,它们都是问号。我的工作解决方案是简单地将数据以我想要的形式输出到CSV文件中,而不是输入到数据库中。但保持同步这是笨拙和恼人的。有什么想法吗?

3 个答案:

答案 0 :(得分:3)

您正在寻找pivotcross table。我对Knime并不多,但那是你想要谷歌搜索的技术。如果Knime没有可用的功能,你可能会比将CSV数据丢弃到MS Excel并转动它更糟糕。

答案 1 :(得分: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 /广泛支持的方法。

答案 2 :(得分:2)

您可以使用KNIME中的Pivoting节点来执行此操作。 只需选择Tag列为Pivot列,Country列为Group列,在Aggregation部分选择Weight列和聚合方法sum。 再见, 托拜厄斯