【问题标题】:Use row values as columns in PostgreSQL在 PostgreSQL 中使用行值作为列
【发布时间】:2014-04-05 20:24:28
【问题描述】:

作为先前查询的结果,我有以下brands 表和total 销售额/month

 id  |   date   | total
-----+----------+------
 123 | Apr-2012 | 100
 123 | Mar-2012 | 150
 123 | Jan-2012 | 500
 987 | Apr-2012 | 5
 987 | Mar-2012 | 0.10
 987 | Feb-2012 | 8

我希望实现以下目标:

 id  | Apr-2012 | Mar-2012 | Feb-2012 | Jan-2012
 123 | 100      | 150      | 0        | 500
 987 | 5        | 0.10     | 8        | 0

我如何将date 值用作列并能够用 0 个总数填充缺失的日期?

【问题讨论】:

标签: sql postgresql pivot crosstab


【解决方案1】:

您的示例的 crosstab() 查询如下所示:

要为结果NULL 值填写0(在评论中请求),请使用COALESCE()

SELECT brand_id
     , COALESCE(jan, 0) AS "Jan-2012"
     , COALESCE(feb, 0) AS "Feb-2012"
     , COALESCE(mar, 0) AS "Mar-2012"
     , COALESCE(apr, 0) AS "Apr-2012"
FROM crosstab(
       'SELECT brand_id, month, total
        FROM   brands
        ORDER  BY 1'

       ,$$VALUES ('Jan-2012'::text), ('Feb-2012'), ('Mar-2012'), ('Apr-2012')$$
 ) AS ct (
   brand_id int
 , jan numeric    -- use actual data type!
 , feb numeric
 , mar numeric
 , apr numeric);

此相关答案中的详细说明和链接:
PostgreSQL Crosstab Query

除此之外:不使用保留字“日期”作为列名,您也不​​应该使用,即使 Postgres 允许这样做。

【讨论】:

  • 非常感谢。关于如何用 0 填空的任何提示?
  • @Jamie:我为此添加了一个解决方案。
  • 有没有办法不对月份名称进行硬编码?例如从另一个查询中获取列表
  • @EugenKonkov:如果您引用输出列名称,这并不容易,因为 SQL 要求预先知道结果列的名称和类型。也许问一个包含所有相关细节的问题......
猜你喜欢
  • 2018-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 2020-11-07
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多