首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将列值分组为列的PostgreSQL查询

将列值分组为列的PostgreSQL查询
EN

Stack Overflow用户
提问于 2018-10-29 22:49:41
回答 2查看 1.6K关注 0票数 4

我的PostreSQL表如下所示。ordered是布尔列,created_at是时间戳。我试图获取行,这些行告诉我成功订单(count(t))和失败订单(count(f))的总数,以及按日分组的订单总数(t + f) (从created_at提取)。

ordered | created_at t | 2018-10-10 20:13:10 t | 2018-10-10 21:23:11 t | 2018-10-11 06:33:52 f | 2018-10-11 13:13:33 f | 2018-10-11 19:17:11 f | 2018-10-12 00:53:01 f | 2018-10-12 05:14:41 f | 2018-10-12 16:33:09 f | 2018-10-13 17:14:14

我希望得到以下结果

created_at | ordered_true | ordered_false | total_orders 2018-10-10 | 2 | 0 | 2 2018-10-11 | 1 | 2 | 3 2018-10-12 | 0 | 3 | 3 2018-10-13 | 0 | 1 | 1

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-29 22:59:44

使用聚合函数sum()count()

代码语言:javascript
复制
select 
    created_at::date, 
    sum(ordered::int) as ordered_true,
    sum((not ordered)::int) as ordered_false,
    count(*) as total_orders
from my_table
group by 1
order by 1

 created_at | ordered_true | ordered_false | total_orders 
------------+--------------+---------------+--------------
 2018-10-10 |            2 |             0 |            2
 2018-10-11 |            1 |             2 |            3
 2018-10-12 |            0 |             3 |            3
 2018-10-13 |            0 |             1 |            1
(4 rows)
票数 3
EN

Stack Overflow用户

发布于 2018-10-29 23:30:21

尝试:

代码语言:javascript
复制
SELECT created_at, 
       COUNT(ordered) filter (where ordered = 't') AS ordered_true,
       COUNT(ordered) filter (where ordered = 'f') AS ordered_false, 
       COUNT(*) AS total_orders 
FROM my_table
GROUP BY created_at

编辑:使用@klint的答案,如created_at在OP分组的评论中指出的那样,将导致不必要的结果,因为某一天将有几个组(时间戳超过一天)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53055030

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档