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
我有以下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