首页 > 解决方案 > SQL 清理帮助 - 根据其他列值创建列

问题描述

我正在使用一个相对较大的数据集 - 我正在尝试根据其他列条目在该表中创建新列。

例如,我有两列名为 Feature 和 FeatureValue。在特征中存在不同的特征,即眼睛、鼻子、嘴巴等。我试图使特征列中的每个唯一值成为一个新列,其中包含来自特征值的相应条目。为了解释,如果第 43 行在 Feature 中保存值“Eyes”,在 FeatureValue 中保存值“Blue”——我希望 Eyes 作为列标题,Blue 作为条目。

我非常感谢任何帮助!

标签: mysqlsql

解决方案


我对您为什么要执行此操作进行了一些猜测 - 我假设您需要加快获取特定功能值的查询。如果这是为了性能,那么可能有比这更好的解决方案,但是我们开始......

如果我理解正确,您需要每个功能的所有值的列表。但是,我不确定您的结果作为表格是否有意义。为了解决这个问题,让我们从我们将调用的表中的示例数据集开始Features

Feature  | FeatureValue
-----------------------
Eyes     | Blue
Nose     | Potato
Eyes     | brown
Eyes     | blue
Eyes     | brown
Nose     | pointy

听起来您想要的是一个转换此表的结果表:

Eyes     | Nose
------------------
Blue     | Potato
brown    | pointy
blue     |

这作为表格没有多大意义,因为共享一行的项目之间没有关系。我希望您正在尝试优化查询以获取这些列表。

所以首先,一个小 SQL 将获取每个特性的值列表:

SELECT Feature, GROUP_CONCAT(DISTINCT FeatureValue) AS `Values` FROM Features GROUP BY Feature;

这将返回与第二个表相同的结果,但横向:

Feature | Values
-------------------------
Eyes    | Blue,brown,blue
Nose    | Potato,pointy

如果您查阅mysql 文档,您将看到您可以指定列表中的分隔符、列表的顺序以及其他一些内容。您可能还想仔细阅读其他 GROUP_BY 方法,以防我误解了您的目标。

为了提高性能,您可以定期缓存此查询 - 我不确定您计划多久重建一次列表。

如果您确实需要将其作为带有列的表,那将变得更加棘手,而且老实说,在代码中可能比开发单个查询更容易完成。


推荐阅读