postgreSQL 获取列值作为新列并添加

postgreSQL getting column values as new column and adding

我有以下table

ident name count
A1 X 1
A1 Y 2
A1 X 6
A2 X 2
A2 Z 3

我需要的是一个新的 table,应该如下所示:

ident X Y Z
A1 7 2 0
A2 2 0 3

所以它应该为每个不同的 ID 提供所有现有名称的总和。 但是用名称构建的列应该自动构建。

我试过了

SELECT
  ident ,
  MAX(CASE WHEN (name = 'X') THEN 1 ELSE NULL END) AS X
FROM
  mytable
GROUP BY ident 
ORDER BY ident 

但是使用这段代码我必须制作列并且可以将总和设置为 0 或 1。

感谢

使用条件聚合,在 Postgres 中如下所示:

select ident,
       sum(count) filter (where name = 'X') as x_sum,
       sum(count) filter (where name = 'Y') as y_sum,
       sum(count) filter (where name = 'Z') as z_sum
from mytable
group by ident;

FILTER 子句是标准的 SQL,但 Postgres 是为数不多的实际支持它的数据库之一。当然,您可以用 CASE 表达式做同样的事情,但是 FILTER 为优化器提供了更多有助于提高性能的提示(许多人发现它更干净)。

您正在查找计数总和:

SELECT
  ident ,
  SUM(CASE WHEN (name = 'X') THEN count ELSE NULL END) AS X,
  SUM(CASE WHEN (name = 'Y') THEN count ELSE NULL END) AS Y,
  SUM(CASE WHEN (name = 'Z') THEN count ELSE NULL END) AS Z
FROM
  mytable
GROUP BY ident 
ORDER BY ident