Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PosrgreSQL数据透视表_Sql_Postgresql_Pivot_Pivot Table - Fatal编程技术网

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