Postgresql 将行转置为列

问题描述 投票:0回答:2

我有这个疑问

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

我有 100 万行,我可以执行此查询

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

       shop |   amount   |    
 -----------+------------+
     shop_1 |   5666     |  
     shop_2 |   4044     |  
     shop_3     4044     | 

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

       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 |

在 postgresql 中将按行中的商店进行分组,并按列中的天进行分组

sql database postgresql pivot crosstab
2个回答
0
投票

首先,您必须安装

tablefunc
扩展。从 9.1 版本开始,您可以使用创建扩展来完成此操作:

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)

0
投票

您可以使用交叉表来达到想要的结果,这是一个解决方案:

SELECT * FROM CROSSTAB(
  'SELECT shop, date, amount FROM sales ORDER BY 1,2',
  'SELECT DISTINCT date FROM sales ORDER BY 1'
) AS ct(shop text, "2012-08-12" int, "2012-08-14" int);

您还可以在这里查看:DbFiddle

说明:交叉表函数有两个参数,一个源查询和一个类别查询。源查询提供要透视的数据,类别查询提供透视表的列名称。您可以在这里查看官方文档:tableFunc

交叉表(源_sql文本,类别_sql文本)→记录集 生成一个“数据透视表”,其中包含由第二个查询指定的值列。

© www.soinside.com 2019 - 2024. All rights reserved.