Comment afficher datatables de table dans un format spécifique

Hey je cherche une sortie spécifique basée sur le tableau ci-dessous

Table de la base

╔══════════════════════════════════════════════════════════════════════╗ ║ Department Division Name Level1 Level2 Level3 GrandTotal ║ ╠══════════════════════════════════════════════════════════════════════╣ ║ Insurance Dissortingbution John 1 3 ║ ║ Insurance Dissortingbution Mark 1 3 ║ ║ Insurance Dissortingbution Joe 1 3 ║ ║ Marketing Dissortingbution Rob 1 2 ║ ║ Marketing Dissortingbution Sam 1 2 ║ ║ Claims Solutions Bob 1 3 ║ ║ Claims Solutions Tom 1 3 ║ ║ Claims Solutions Gin 1 3 ║ ╚══════════════════════════════════════════════════════════════════════╝ 

La sortie que je cherche est

 ╔═════════════════════════════════════════════════════════════════════════════╗ ║ Department Division Name Level1 Level2 Level3 GrandTotal ║ ╠═════════════════════════════════════════════════════════════════════════════╣ ║ Insurance Dissortingbuton 3 ║ ║ John 1 1 ║ ║ Mark 1 1 ║ ║ Joe 1 1 ║ ║ Marketing Dissortingbution 2 ║ ║ Rob 1 1 ║ ║ Sam 1 1 ║ ║ Claims Solution 3 ║ ║ Bob 1 1 ║ ║ Tom 1 1 ║ ║ Gin 1 1 ║ ╚═════════════════════════════════════════════════════════════════════════════╝ 

Tout d'abord, s'il y avait un nom pour ce type de sortie de table, je m'excuserais car je ne le connais pas et aurait rendu le titre meilleur. J'ai eu l'idée d'utiliser un slider pour parcourir chaque ligne et stocker le département et la division dans une variable et de vérifier chaque fois que c'était la même chose et, si tel était le cas, vider le département et la division jusqu'à ce qu'ils changent. Mais j'espère qu'il y a un moyen plus facile de le faire. Toute aide serait appréciée Merci.

Comme @SQLPolice a dit, vous pouvez faire quelque chose comme ça avec rollup, mais je ne peux pas vraiment le reorder. Il devient salissant et difficile à maintenir. Cela devrait vraiment être fait en dehors de la database:

 select case when grouping(name) = 1 then department end as department, case when grouping(name) = 1 then division end as division, name, case when grouping(name) = 0 then sum(isnull(level1,0)) end as level1, case when grouping(name) = 0 then sum(isnull(level2,0)) end as level2, case when grouping(name) = 0 then sum(isnull(level3,0)) end as level3, case when grouping(name) = 1 then sum(isnull(level1,0)) + sum(isnull(level2,0)) + sum(isnull(level3,0)) end as GrandTotal from table1 group by department, division, rollup(name) order by table1.department, table1.division, grouping(name) desc 

Mon hypothèse était que le total général devrait en fait être le total général des lignes, et montré seulement au niveau du résumé, pas pour tous, et qu'il n'existe pas vraiment dans datatables.

L'astuce ici est le groupement (champ) qui indique si la ligne est la ligne de détail ou la ligne de résumé, et le sommaire crée les résumés au niveau supérieur.

Voici SQL Fiddle pour jouer.