我有这个疑问
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 中将按行中的商店进行分组,并按列中的天进行分组
首先,您必须安装
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)
您可以使用交叉表来达到想要的结果,这是一个解决方案:
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文本)→记录集 生成一个“数据透视表”,其中包含由第二个查询指定的值列。