我有以下
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 的缺失日期?
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 允许)。