在PostgreSQL中使用行值作为列

oxosxuxt  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(1)|浏览(134)

我有下面的brands表,其中每个month的销售额为total,这是以前查询的结果:

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个总数填充缺失的日期?

eufgjt7s

eufgjt7s1#

示例的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);

详细说明及链接:

  • PostgreSQL交叉表查询

旁白:我避免了标准SQL中的reserved word“date”作为列名(即使Postgres允许)。

相关问题