SQL 查询按两个不同的列分组

标签 sql postgresql union aggregate-functions

我想要一个查询,其中数据按 reseller_id 分组,其中 parent_res_id = 0。所有其他行应使用 parent_res_id 而不是 reseller_id

例如,parent_res_id 0(管理员帐户)产生了两个 reseller_id:1 和 2。它们各自创建了另一个经销商(分别为 3 和 4)。我想将 child 的行与他们的 parent 分组,所以 reseller_id 3 的行被添加到 1, reseller_id 4 的行被添加到 2。基本上它是一棵树深度 1.

表:

duration  call_charge reseller_id  parent_res_id
2             1              1           0
3             2              2           0
4             3              3           1
5             4              4           2
6             5              5           1
7             6              6           5

期望的结果:

sum(duration)  sum(call_charege) reseller_id 
19                 15                 1
8                  6                  2

最佳答案

UNION ALL :

SELECT reseller_id, sum(duration) AS sum_dur, sum(call_charge) AS sum_char
FROM  (
   SELECT reseller_id, duration, call_charge
   FROM   tbl
   WHERE  parent_res_id = 0

   UNION ALL
   SELECT parent_res_id, duration, call_charge
   FROM   tbl
   WHERE  parent_res_id <> 0
   ) sub
GROUP  BY 1;

替代 CASE表达式:

SELECT CASE WHEN parent_res_id = 0
            THEN reseller_id
            ELSE parent_res_id
       END AS reseller_id
     , sum(duration) AS sum_dur, sum(call_charge) AS sum_char
FROM   tbl
GROUP  BY 1;

同样的结果。可能更快,因为它只需要一次表扫描。

对于深度大于 1 或 2 的树,递归 CTE 是正确的技术。示例:

关于SQL 查询按两个不同的列分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28452372/

相关文章:

c# - LINQ 规范化数据

.net - 在 SqlCommand 上传递参数不起作用

java - 如何防止在 Heroku PostgreSQL 中删除公共(public)模式?

MySQL 按两列排序,一个 ASC 和一个 RAND()

postgresql - 如何在 ubuntu 服务器上安装 postgis?

php - 用于 Postgresql 查询的 PHP 中列名的绑定(bind)变量

arrays - PostgreSQL 中两个数组的并集,无需取消嵌套

sql - Oracle:当同一查询中更具体的值为空时,如何获取默认值?

ios - PHP/MySQL : Obtain two items from table in join using different criteria

mysql - SQL 语句语法差异