Mysql SQL/Knime-将表转置为;分组方式;
标题很糟糕,但这是我能做的最好的了。我拥有的是这样的东西:Mysql SQL/Knime-将表转置为;分组方式;,mysql,sql,pivot,knime,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 ---------------------
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中,我成功地创建了我想要的矩阵结构(国家x标记),但我不知道如何填充实际的权重值,它们都是问号。我的工作解决方案是简单地将数据以我想要的形式输出到CSV文件中,而不是输出到数据库中。但是,保持同步是非常糟糕和恼人的。有什么想法吗?您正在寻找一个
pivot
或cross table
。我对Knime不太感兴趣,但这就是你想在谷歌上搜索的技术。如果Knime没有该功能可用,您可能会做得比将CSV数据放入MS Excel并透视它更糟糕。使用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查询,以将行数据转换为列数据
PIVOT(和UNPIVOT)是ANSI语法,但支持有点滞后——我只知道SQL Server 2005+、Oracle 11g+。这是下一个最受ANSI/广泛支持的方法。您可以使用KNIME中的旋转节点来执行该技巧。 只需选择Tag列作为Pivot列,Country列作为Group列,在Aggregation部分选择Weight列和作为Aggregation method sum。 再见,
Tobias每当我读到pivot表时,它总是非常关注聚合。我不知道他们能解决这样的问题。一个元素的和就是那个元素。。。Duhun幸运的是我正在使用MySQL。我必须自动生成查询,因为大约有250个国家和200个标签。幸运的是,Knime有很好的数据透视支持,我只是不知道它适用于这种情况。@OMG Pnies:您也可以发布t-SQL语法吗?我猜有些人可能也对Oracle感兴趣。@PPC:以上内容在SQL Server、Oracle和PostgreSQL上都可以正常工作,无需修改。基本上,支持
大小写
语法的任何内容。我已经更新了这个问题,添加了pivot标记——任何人都可以寻找与他们选择的DB的组合,对pivot关键字的支持相对较新。