Ignorer les lignes cumulées dupliquées lorsque datatables sont NULL

Je voudrais créer un rapport pour une hiérarchie d'organisation par positions. La hiérarchie a 4 niveaux, la Position est toujours la dernière feuille, mais le path n'est pas nécessairement à 4 niveaux.

Par exemple:

Société> position

Société> Section> Département> position

Je veux avoir le nombre de personnel.

declare @hierarchy table ( Company nvarchar(50), Section nvarchar(50), Department nvarchar(50), Unit nvarchar(50), Position nvarchar(50), Person nvarchar(50) ) insert into @hierarchy values ('WD', 'Weapons', 'IT', 'officer', null, 'Wile E.'), ('ACME', 'Weapons', 'IT', 'Network', 'engineer', 'Brain'), ('ACME', 'Weapons', 'IT', 'Network', 'support', 'Pinky'), ('ACME', 'Weapons', 'IT', 'officer', null, 'Bugs'), ('ACME', 'Weapons', 'IT', 'officer', null, 'Elmer'), ('ACME', 'Weapons', 'IT', 'officer', null, 'Daffy'), ('ACME', 'Weapons', 'tech', null, null, 'Sylverster'), ('ACME', 'Anvils', 'officer', null, null, 'Road') select Company, Section, Department, Unit, Position, count(Person) from @hierarchy group by rollup(Company, Section, Department, Unit, Position) 

Dans l'exemple ci-dessus, je reçois les mêmes 3 lignes pour WD (WD, Anvils, officier, NULL, NULL), où une serait suffisante, car l'unité et la position ne sont pas applicables.

Cependant, si je mets un distinct dans la requête, j'obtiens un résultat apparemment bon

 select distinct Company, Section, Department, Unit, Position, count(Person) from @hierarchy group by rollup(Company, Section, Department, Unit, Position) 

Ce que je ne sais pas est si c'est juste un bidouillage et j'ai eu de la chance, ou si c'est une approche correcte pour ce problème?

Ajoutons des colonnes GROUPING pour chaque niveau:

 SELECT Company, Section, Department, Unit, Position, GROUPING(Company) as Company, GROUPING(Section) AS Section, GROUPING(Department) AS Department, GROUPING(Unit) AS Unit, GROUPING(Position) AS Position, COUNT(*) from @hierarchy group by ROLLUP(Company, Section, Department, Unit, Position) 

Et regardez vos valeurs en double:

 Company Section Department Unit Position Company Section Department Unit Position ---------- ---------- ---------- ---------- ---------- ------- ------- ---------- ---- -------- ----------- ACME Anvils officer NULL NULL 0 0 0 0 0 1 ACME Anvils officer NULL NULL 0 0 0 0 1 1 ACME Anvils officer NULL NULL 0 0 0 1 1 1 ACME Anvils NULL NULL NULL 0 0 1 1 1 1 ACME Weapons IT Network engineer 0 0 0 0 0 1 ACME Weapons IT Network support 0 0 0 0 0 1 ACME Weapons IT Network NULL 0 0 0 0 1 2 ACME Weapons IT officer NULL 0 0 0 0 0 3 ACME Weapons IT officer NULL 0 0 0 0 1 3 ACME Weapons IT NULL NULL 0 0 0 1 1 5 ACME Weapons tech NULL NULL 0 0 0 0 0 1 ACME Weapons tech NULL NULL 0 0 0 0 1 1 ACME Weapons tech NULL NULL 0 0 0 1 1 1 ACME Weapons NULL NULL NULL 0 0 1 1 1 6 ACME NULL NULL NULL NULL 0 1 1 1 1 7 WD Weapons IT officer NULL 0 0 0 0 0 1 WD Weapons IT officer NULL 0 0 0 0 1 1 WD Weapons IT NULL NULL 0 0 0 1 1 1 WD Weapons NULL NULL NULL 0 0 1 1 1 1 WD NULL NULL NULL NULL 0 1 1 1 1 1 NULL NULL NULL NULL NULL 1 1 1 1 1 8 

(ACME, Anvils, officier) répète 3 fois, mais chaque fois c'est un nouveau niveau de regroupement: par département, par département et par unité, par département, unité et position. C'est parce que nous utilisons toutes les colonnes en groupe. Mais les valeurs dans Unit et Position sont NULL .

Ainsi, vous pouvez append DISTINCT à votre requête pour get des résultats uniques par vos colonnes – c'est correct.

Vous pourriez opter pour un groupe de syndicats au lieu d'un cumul?

 select concat(Company,' ',Section,' ',Department,' ',Unit,' ',Position) as Hierarchy, Total from ( select Company, Section, Department, Unit, Position, count(*) as total from @hierarchy group by Company, Section, Department, Unit, Position union select Company, Section, Department, Unit, null, count(*) from @hierarchy group by Company, Section, Department, Unit union select Company, Section, Department, null, null, count(*) from @hierarchy group by Company, Section, Department union select Company, Section, null, null, null, count(*) from @hierarchy group by Company, Section union select Company, null, null, null, null, count(*) from @hierarchy group by Company ) q order by Company, Section, Department, Unit, Position; 

Donne:

 ACME 7 ACME Anvils 1 ACME Anvils officer 1 ACME Weapons 6 ACME Weapons IT 5 ACME Weapons IT Network 2 ACME Weapons IT Network engineer 1 ACME Weapons IT Network support 1 ACME Weapons IT officer 3 ACME Weapons tech 1 WD 1 WD Weapons 1 WD Weapons IT 1 WD Weapons IT officer 1