J'ai une table qui ressemble à ça

Person#  |  Person Name   | Gender | Persons Net Worth
-----------------------------------------------------------
1          Donald J           M        20
2          George W           M        20
3          Mark   B           T        20
4          Hil    C           F        20
5          Hil    C           F        20
6          Bill   C           M        20
7          Eric   Z           M        20
8          Caitl  J           T        20

Je souhaite rassembler des sous-totaux pour chaque groupe de sexe . Je dois essentiellement

Incorporer un sum(NETWORTH) where gender = 'M' group by gender sort by gender

Et un

sum(NETWORTH) where gender = 'F' group by gender sort by gender

Et un

sum(NETWORTH) where gender = 'T' group by gender sort by gender

Donc, je veux essentiellement que le résultat soit le suivant:

Person#  |  Person Name   | Gender | Persons Net Worth
-----------------------------------------------------------
1          Donald J           M        20
2          George W           M        20
6          Bill   C           M        20
7          Eric   Z           M        20
                                Total: 80
4          Hil    C           F        20
5          Hil    C           F        20
                                Total: 40
3          Mark   B           T        20
8          Caitl  J           T        20
                                Total: 40

J'ai essayé d'utiliser WITH ROLLUP mais j'ai échoué lamentablement. Je sais comment manipuler le code derrière pour y parvenir, mais je préfère tout faire en une seule requête SQL si possible.

Merci d'avance

1
Yusha 6 avril 2017 à 17:09

2 réponses

Meilleure réponse

J'utiliserais grouping sets (voir ici):

select Person#, Name, Gender, sum(networth) as networth
from t
group by grouping sets ( (#Person, Name, Gender), (Gender));

Bien que cela semble faire une agrégation supplémentaire, la syntaxe est flexible pour toutes sortes de sous-totaux. Par exemple, si vous vouliez également le total global:

group by grouping sets ( (#Person, Name, Gender), (Gender), ());
4
Gordon Linoff 6 avril 2017 à 14:23

Cela devrait faire l'affaire: vous utilisez union all avec la table et son agrégation par gender, en utilisant comme valeur gender dans l'agrégée quelque chose de similaire à l'original gender, qui vous permet de trier la table finale comme vous le souhaitez.

select  *
from    (
            select  *
            from    yourTable
            union all
            select  null, null, CONCAT(Gender, '_TOT'), sum(Persons_net_worth)
            from    yourTable
            group by CONCAT(Gender, '_TOT')
        )
order by Gender

Je ne maîtrise pas DB2 Oracle, cela peut nécessiter quelques ajustements

0
Stefano Zanini 6 avril 2017 à 14:15