我有以下SQL。大多数G1和G2是一对一的关系。一些是一对多的关系。以下SQL将显示太多“ Total2 ”。当G1和G2是一对一时,是否可以删除这些 Total2 行?
SELECT CASE WHEN GROUPING_ID(G1) = 1 THEN 'Total1' ELSE G1 END,
CASE WHEN GROUPING_ID(G2) = 1 THEN 'Total2' ELSE G2 END,
SUM(a),
SUM(b),
count(*)
FROM data
GROUP BY
G1, G2 WITH ROLLUP
答案 0 :(得分:1)
不幸的是,我不知道如何在这里避免使用子查询
使用子查询我们可以使用一个技巧 - 当我们按G1分组并且同时G1和G2具有1对1的关系(即相等)时,意味着max(G2)将等于min(g2)并且这个条件将允许我们构建一个where子句并摆脱它们
代码可能是这样的
select * from
(
SELECT CASE
WHEN GROUPING_ID(G1) = 1 THEN 'Total1' ELSE G1 END as G1,
MIN(g2) as min_g2,
max(g2) as max_g2,
CASE WHEN GROUPING_ID(G2) = 1 THEN 'Total2' ELSE G2 END as G2,
SUM(a) as SUM_A,
SUM(b) as SUM_B,
count(*) as cnt
FROM data
GROUP BY G1, G2
WITH ROLLUP
) t
where
not (min_g2 = max_g2 and g2 = 'Total2')