将列标题转置为postgresql中的行

cab*_*oad 10 sql postgresql

我有一个看起来像这样的观点

          value1count     value2count value3count
          ----------------------------------------
             25              35          55
Run Code Online (Sandbox Code Playgroud)

我需要将列标题转换为行,所以我需要它看起来像

          Values              Count
         -----------------------------
           value1count         25
           value2count         35
           value3count         55
Run Code Online (Sandbox Code Playgroud)

我可以通过选择单个列名称作为第一列,将数据作为第二列,然后为所有列执行相同的并集来完成此操作.

有一个更好的方法吗?我正在使用PosgreSQL 8.1,因此没有使用枢轴运算符.

感谢您的回复.

Pin*_*nyM 32

Crosstab只会与您需要的相反,但这应该可以帮助您:

首先创建unnest()8.4中包含的功能,请参阅此处获取说明.

然后你可以这样做(基于这篇文章):

SELECT
   unnest(array['value1Count', 'value2Count', 'value3Count']) AS "Values",
   unnest(array[value1Count, value2Count, value3Count]) AS "Count"
FROM view_name
ORDER BY "Values"
Run Code Online (Sandbox Code Playgroud)

我可以验证这是在8.4中工作,但因为我没有8.1,我不能保证它会工作相同.

  • 这很精彩.在8.1中我工作得很好.我的联合查询需要10秒钟,这个不需要的查询只用了3秒钟......非常感谢PinnyM. (2认同)

Mic*_*lif 7

我通过使用hstore功能实现了你的目标:

SELECT (x).key, (x).value
FROM
  ( SELECT EACH(hstore(t)) as x
    FROM   t
  ) q;
Run Code Online (Sandbox Code Playgroud)

如果您的"待爆炸"视图或表(此处称为t)中有多行,则可能需要在中间表中插入一个附加标识符q,例如:

SELECT id, (x).key, (x).value
FROM
  ( SELECT id, EACH(hstore(t)) as x
    FROM   t
  ) q;
Run Code Online (Sandbox Code Playgroud)

参考:hstore文档


Sté*_*ane 5

我正在寻找与此类似的操作,以便更轻松地处理来自 bash 脚本的表信息。事实证明,告诉 psql 将表列显示为行非常容易:

psql mydbname -x -A -F= -c "select * from blah where id=123"
Run Code Online (Sandbox Code Playgroud)
  • -x就是输出的支点。
  • -A去除多余的空格。
  • -F=替换|=列名和值之间。

这当然不会在 SQL 中工作,它只会修改psql格式化输出的方式。

  • 谢谢!如果您在交互式 psql 会话期间需要这种行为,则只要输出表对于您的终端来说太宽,您就可以使用“\x on”甚至“\x auto”切换到该模式。 (2认同)