2015-11-10 7 views
0

Je suis sur SQL Server 2014 et j'ai une liste d'ID de bâtiment avec différentes colonnes de totaux. Je voudrais ajouter une rangée de totaux pour le bâtiment.TSQL: Comment ajouter une ligne de totaux

La sortie souhaitée suivante peut-elle être effectuée dans SQL? Si oui, quelle est la meilleure façon? J'ai besoin d'apprendre comment cela pour divers projets. Je n'ai pas besoin de totaux LevelID, juste pour les autres colonnes, et je ne suis pas sûr de pouvoir ajouter le texte 'BuildingTotal' dans la ligne des totaux.

sortie souhaitée:

enter image description here

SQL Fiddle:

Voici le code pour une table de test en cas SQL Fiddle ne fonctionne pas.

CREATE TABLE EMPLOYEES 
(
BuildingID Numeric, 
LevelID Numeric, 
FemaleEmp Numeric, 
MaleEmp Numeric, 
TotalEmpByLevel Numeric 
) 

INSERT INTO EMPLOYEES 
(BuildingID, LevelID, FemaleEmp, MaleEmp, TotalEmpByLevel) 
VALUES 
(111, 1,91, 89, 180), 
(111, 2,98, 94, 192), 
(111, 3,94, 113 , 207), 
(111, 4,110, 119, 229), 
(111, 5,107, 9, 203), 
(113, 1,53, 4, 101), 
(113, 2,51, 5, 106), 
(113, 3,68, 5, 119), 
(113, 4,58, 6, 118), 
(113, 5,57, 6, 117), 
(114, 1,25, 3, 56), 
(114, 2,26, 3, 63), 
(114, 3,32, 2, 61), 
(114, 4,27, 3, 58), 
(114, 5,26, 2, 49), 
(116, 1,84, 102 , 186), 
(116, 2,83, 92, 175), 
(116, 3,89, 87, 176), 
(116, 4,71, 91, 162), 
(116, 5,87, 72, 159) 

Nous vous remercions de votre aide!

+1

Do (sélectionner ... UNION ALL sélectionner avec le groupe par) commande par ... – jarlh

Répondre

2

Une méthode consiste à utiliser des ensembles de regroupement ou avec Rollup. Cela nécessite un petit tour, cependant. Vous avez besoin d'une requête d'agrégation:

select BuildingId, LevelId, sum(FemaleEmp) as FemaleEmp, 
     sum(MaleEmp) as MaleEmp, sum(TotalEmpByLevel) as TotalEmpByLevel 
from employees 
group by grouping sets((BuildingId, LevelId), (BuildingId)); 

Vous pouvez ajouter le mot Total aux lignes. Ceci est un peu difficile, parce que les types sont différents:

select (case when grouping(LevelId) = 1 then 'Building Total' else cast(BuildingId as varchar(255)) end) as BuildingId, 
     LevelId, sum(FemaleEmp) as FemaleEmp, 
     sum(MaleEmp) as MaleEmp, sum(TotalEmpByLevel) as TotalEmpByLevel 
from employees 
group by grouping sets((BuildingId, LevelId), (BuildingId)); 
+0

Voir https démo: // data.stackexchange.com/stackoverflow/query/388044. Vous devez utiliser 'grouping (LevelId)' pas 'grouping (BuildingId)' – lad2025

+0

Merci @Gordon Linoff !. La partie regroupement a fonctionné. – JM1

+1

@ lad2025, vous avez raison sur le groupement levelid. Je vous remercie! – JM1

2

Groupe Essayez avec par Rollup

Ceci est link par exemple

+0

vous êtes les bienvenus :) – starko