PosrgreSQL数据透视表
我需要从源代码创建一个透视表,就像这个表一样PosrgreSQL数据透视表,sql,postgresql,pivot,pivot-table,Sql,Postgresql,Pivot,Pivot Table,我需要从源代码创建一个透视表,就像这个表一样 FactID UserID QTY Product 1 10 100 A 2 10 200 B 3 10 300 C 4 12 50 A 5 12 60 B 6 12 70 C 7 15 500 A 8 15 550 B 9
FactID UserID QTY Product
1 10 100 A
2 10 200 B
3 10 300 C
4 12 50 A
5 12 60 B
6 12 70 C
7 15 500 A
8 15 550 B
9 15 600 C
需要这样的支点吗
UserID A B C
10 100 200 300
12 50 60 70
15 500 550 600
我的尝试
Select UserID,
CASE WHEN product = 'A' then QTY end as A,
CASE WHEN product = 'B' then QTY end as B,
CASE WHEN product = 'C' then QTY end as C
from public.table
和结果
UserID A B C
10 100 100 100
10 200 200 200
10 300 300 300
12 50 50 50
12 60 60 60
12 70 70 70
15 500 500 500
15 550 550 550
15 600 600 600
我的错在哪里?也许还有别的方法吗?非常接近。您只需要聚合:
Select UserID,
SUM(CASE WHEN product = 'A' then QTY end) as A,
SUM(CASE WHEN product = 'B' then QTY end) as B,
SUM(CASE WHEN product = 'C' then QTY end) as C
from public.table
group by UserId;
不过,在Postgres中,这通常会使用FILTER
子句,而不是CASE
:
Select UserID,
SUM(qty) FILTER (WHERE product = 'A') as A,
SUM(qty) FILTER (WHERE product = 'B') as B,
SUM(qty) FILTER (WHERE product = 'C') as C
from public.table
group by UserId;
您需要聚合函数作为
Select UserID,
Max(CASE WHEN product = 'A' then QTY end) as A,
Max(CASE WHEN product = 'B' then QTY end) as B,
Max(CASE WHEN product = 'C' then QTY end) as C
from public.table
Group by userid