我想要一个查询,其中数据按 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/