Postgresql 将行转换为列

MG *_*G N 5 sql database postgresql pivot crosstab

我有这个查询

select * from sales

       shop |    date    |    hour   | row_no | amount
 -----------+------------+-----------+--------+-----------
     shop_1 | 2012-08-14 | 00:08:00  | P01    | 10
     shop_2 | 2012-08-12 | 00:12:00  | O05    | 40
     shop_2 | 2012-08-12 | 00:12:00  | A01    | 20
Run Code Online (Sandbox Code Playgroud)

我有 100 万行,我可以做这个查询

select shop, SUM(amount) 
from sales 
group by shop

       shop |   amount   |    
 -----------+------------+
     shop_1 |   5666     |  
     shop_2 |   4044     |  
     shop_3     4044     | 
Run Code Online (Sandbox Code Playgroud)

但是我需要在专栏上度过几天,我不知道他们是否可以帮助我做到这一点

       shop |    2012-08-1    |    2012-08-2   | 2012-08-3 |
 -----------+------------+-----------+--------+-----------
     shop_1 |      4005       |      5667     |      9987  |     
     shop_2 |      4333      |      4554     |      1234  |     
     shop_3 |      4555       |      6778     |      6677 |
Run Code Online (Sandbox Code Playgroud)

将在行中按存储分组,并在 postgresql 的列中按天分组

use*_*754 0

首先,您必须安装tablefunc扩展。从 9.1 版本开始,您可以使用 create extension 来完成此操作:

CREATE EXTENSION tablefunc;

select * from crosstab (  
    select shop, date, SUM(amount) 
    from sales 
    group by shop

    'select date from sales order by 1') 
AS ct(shop: text,  '2012-08-1' text, '2012-08-2' text, '2012-08-3' text)
Run Code Online (Sandbox Code Playgroud)