在 PostgreSQL 中使用行值作为列

问题描述 投票:0回答:1

我有以下

brands
表,其中包含每个
total
month
销售额,作为先前查询的结果:

id 日期 总计
123 2012 年 4 月 100
123 2012 年 3 月 150
123 2012 年 1 月 500
987 2012 年 4 月 5
987 2012 年 3 月 0.10
987 2012 年 2 月 8

我希望实现以下目标:

id 2012 年 4 月 2012 年 3 月 2012 年 2 月 2012 年 1 月
123 100 150 0 500
987 5 0.10 8 0

如何使用

date
值作为列标签并填写总计 0 的缺失日期?

sql postgresql pivot pivot-table
1个回答
17
投票

您的示例的

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);

详细解释和链接:

旁白:我避免使用标准 SQL“日期”中的保留字作为列名(即使 Postgres 允许)。

© www.soinside.com 2019 - 2024. All rights reserved.