【问题标题】:PostgreSQL. Get value from rows and change rows to columnsPostgreSQL。从行中获取值并将行更改为列
【发布时间】:2015-10-16 10:58:27
【问题描述】:

我有一个返回表格的视图:

cat_name | Jan | Feb | Mar | ... | YEAR
student  |  0  |  23 | 12  | ... | 2013
student  | 10  |  2  | 8   | ... | 1999
professor| 12  |  9  | 3   | ... | 2015
teacher  |  3  |  8  | 5   | ... | 2015

我需要让视图像这样返回:

cat_name | 1999 | 2013 | 2015 | ...
student  |  20  |  35  |  0   | ...
professor|  0   |   0  |  24  | ...
teacher  |  0   |   0  |  16  | ...

对行求和并选择不同的 cat_name:

SELECT cat_name, "YEAR", 
   COALESCE("Jan",0)+COALESCE("Feb",0)+COALESCE("Mar",0)+
   ... +COALESCE("Dec",0) AS sum
FROM view
GROUP BY "YEAR", cat_name, sum;

有没有办法让“YEAR”值列名称?年数不固定,cat_name 的数量也是固定的。 例如,我怎样才能在 (select distinct "YEAR" from view) 中列出一些列表,并在 CASE WHEN "YEAR" = 2014 中使用今年而不是 2013、2014...?

【问题讨论】:

  • 选择的结果具有固定数量的列 - 与表数据无关。

标签: sql postgresql pivot


【解决方案1】:

您可以使用条件聚合来做到这一点:

SELECT cat_name, "YEAR", 
       SUM(CASE WHEN "YEAR" = 2013
                THEN COALESCE("Jan", 0) + COALESCE("Feb", 0) + COALESCE("Mar", 0)+ . . .
           END) as "2013",
       SUM(CASE WHEN "YEAR" = 2014
                THEN COALESCE("Jan", 0) + COALESCE("Feb", 0) + COALESCE("Mar", 0)+ . . .
           END) as "2014",
       . . .
FROM view
GROUP BY cat_name;

如果您在输出中需要可变数量的列,则可以使用crosstab 查询。 Here 就是一个例子。

【讨论】:

  • 例如,我怎样才能在 (select distinct "YEAR" from view) 中列出一些列表,然后在 CASE WHEN "YEAR" = 2014 中使用今年而不是 2013、2014...?
猜你喜欢
  • 2021-10-10
  • 2022-11-25
  • 1970-01-01
  • 2019-02-18
  • 1970-01-01
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多