1

次のSQLがあります。G1 と G2 のほとんどは 1 対 1 の関係です。いくつかは 1 対多の関係です。次の SQL では、「Total2」が多すぎます。G1 と G2 が 1 対 1 の場合、これらの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
4

1 に答える 1

1

残念ながら、ここでサブクエリを回避する方法がわかりません

サブクエリでは、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')
于 2011-08-15T11:14:04.893 に答える