2011-07-15 4 views
1

J'ai le code SQL suivant. La plupart des G1 et G2 sont des relations un-à-un. Quelques-uns sont des relations un-à-plusieurs. Le SQL suivant affichera trop de "Total2". Est-il possible de supprimer ces Total2 lignes lorsque G1 et G2 sont en tête-à-tête?Redémarrage conditionnel de SQL Server (uniquement cumulatif lorsqu'il existe plusieurs sous-groupes)

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 

Répondre

1

malheureusement je n'ai aucune idée comment éviter sous_requête ici

Avec sous-requête, nous pouvons utiliser un tour - quand nous regroupons par G1 et en même temps G1 et G2 ont 1 à 1 relation (par exemple l'égalité) cela signifie que max (G2) sera égal à min (g2) et cette condition nous permettra de construire une clause where et se débarrasser d'eux

code

peut être comme celui-ci

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') 
Questions connexes