如何将列值分隔为列名?

Posted

技术标签:

【中文标题】如何将列值分隔为列名?【英文标题】:How can I separate column values in to column names? 【发布时间】:2018-01-04 07:33:00 【问题描述】:

我正在尝试制作一个包含动态列的表格。

我有这张桌子。这只是简化了,在其他情况下,它们可能有更多的值而不是 3。

姓名 ---------------------- 落下 药物 漫步 (3 行)

我正在努力得到这个结果。我需要将值分成列。

秋季 |药物 |漫步 --------+------------+-------- (0 行)

【问题讨论】:

所以这个查询将返回第一个值“Fall”。你到底想要什么。您可以使用 a[2] 和 a[3] 来获取其他值 我不希望它返回值。会希望它以列名的形式返回值。 您可以在值中添加逗号,例如 ''' ||一个[1]|| '''。它会返回'Fall' 是的,我知道我已经尝试过了,但我不能使用这些“a[1]”,因为有些情况下会有更多的值。这些应该是动态的而不是恒定的 那么你应该去寻找一个函数并在其中创建一个循环 【参考方案1】:

您需要 PIVOT 表。不幸的是 mysql(与 Oracle http://www.oracle.com/technetwork/articles/sql/11g-pivot-097235.html 不同)没有 PIVOT 运算符,但似乎有一些解决方法。 MySQL pivot table

【讨论】:

问题是关于 Postgres,而不是 MySQL(但 Postgres 也没有枢轴) 看起来@prinsarian 可能有您正在寻找的答案。 crosstab() 看起来确实像您正在寻找的功能 @leonardseymore 尝试了交叉表,但我仍然必须为此命名列。所以这不是答案【参考方案2】:

您可以在较新的 PostgreSQL 中尝试其中一个 crosstab() 函数。请参阅https://www.postgresql.org/docs/current/static/tablefunc.html(F.35.1.2 和 F.35.1.4)。它允许您指定具有行名(创建行)、类别(创建列)和值(填充表的内部)的查询。

具有 2 个查询的变体可能特别有用,因为它允许您指定要用于单独查询的列。

【讨论】:

(我假设您的问题是关于 PostgreSQL 数据库和相当新的版本) 是的,但您必须声明列名。 SELECT * FROM crosstab('...') AS ct(row_name text, category_1 text, category_2 text);

以上是关于如何将列值分隔为列名?的主要内容,如果未能解决你的问题,请参考以下文章

SQL:将列值链接到列名以满足某些条件

SQLServer如何修改一列的列名呢?

SQLServer如何修改一列的列名呢?

将列值分配给数据框中的变量

Mysql-DQL

如何获得第二大列值和列名