在PostgreSQL中使用行值作为列

Jam*_*mie 5 sql postgresql pivot crosstab

我有以下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
Run Code Online (Sandbox Code Playgroud)

我期待实现以下目标:

 id  | Apr-2012 | Mar-2012 | Feb-2012 | Jan-2012
 123 | 100      | 150      | 0        | 500
 987 | 5        | 0.10     | 8        | 0
Run Code Online (Sandbox Code Playgroud)

如何将date值用作列,并能够用0总计填写缺少的日期?

Erw*_*ter 9

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

要填写0结果NULL值(请求注释),请使用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);
Run Code Online (Sandbox Code Playgroud)

此相关答案中的详细说明和链接:
PostgreSQL交叉表查询

除此之外:不使用保留字"date"作为列名,即使Postgres允许,也不应该使用保留字"date".

  • 真是太棒了,谢谢。关于如何用 0 填充空格的任何提示? (2认同)
  • @Jamie:我为此添加了一个解决方案。 (2认同)
  • 有没有办法不硬编码月份名称?例如从另一个查询获取列表 (2认同)