2017-08-16 1 views
0

Je veux faire un ROLLUP sur la colonne Language et générer la dernière ligne en tant que Total.
Je ne sais pas où mettre le ROLLUP.
Pour exemple:Comment faire une colonne ROLLUP on Language et obtenir une ligne de TOTAL comme dernière ligne?

AS 
     BEGIN 
      declare @sqlCommand NVARCHAR(4000) = 
      'SELECT Language, col2, col3, col4, Total = col2 + col3 + col4 
      FROM ( SELECT xL.lN, xS.sN, UC.UC 
        FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS 
        ON UC.ssn = xS.ssn 
        WHERE 
         ((DS BETWEEN .... AND ....) AND 
         (HS BETWEEN .... AND ....) AND 
         (MS BETWEEN .... AND ....))) UCs 
         PIVOT (SUM (UC) for sN IN 
         (col2, col3, col4)) 
         AS PVT;'; 
     EXEC SP_EXECUTESQL @sqlCommand 
     END 

Répondre

0

Rollup est fait avec Group by.. si vous devez appliquer un groupe par ici, vous devez regrouper par toutes les colonnes que vous avez sélectionnées.

0

Vous pouvez essayer des ensembles de regroupement.

With result as (
    SELECT Language, col2, col3, col4, Total = col2 + col3 + col4 
    FROM ( SELECT xL.lN, xS.sN, UC.UC 
      FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS 
      ON UC.ssn = xS.ssn 
      WHERE 
      ((DS BETWEEN .... AND ....) AND 
      (HS BETWEEN .... AND ....) AND 
      (MS BETWEEN .... AND ....)) 
    ) UCs 
    PIVOT (SUM (UC) for sN 
     IN (col2, col3, col4) 
    ) AS PVT 
) 
SELECT Language, col2, col3, col4, sum(Total) as Total 
FROM result 
GROUP BY GROUPING SETS((Language, col2, col3, col4),()) 
+0

Merci pour cela. Cette solution a aidé mais encore, je reçois la dernière rangée comme NULL. Il ajoute une ligne –

+0

@syang Cependant, je reçois la dernière ligne comme NULL. RANGE = [2], [3], [4], [5] serveur SELECT, '+ RANGE +', somme (total) en tant que total \t \t \t \t \t partir résultat \t \t \t \t \t GROUP BY GROUPING SETS ((Serveur, '+ RANGE +'),()); '; Pouvez-vous m'aider s'il vous plaît avec ceci plus loin? –

+0

Je ne comprends pas ce que vous voulez dire. Pouvez-vous mettre un exemple de résultat avec la sortie de l'idée pour la dernière rangée? –

0

Si vous essayez d'obtenir total de la ligne avec une somme de chaque colonne, vous pouvez essayer les requêtes suivantes:

--method 1:

With result as (
    SELECT Language, col2, col3, col4, Total = col2 + col3 + col4 
    FROM ( SELECT xL.lN, xS.sN, UC.UC 
      FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS 
      ON UC.ssn = xS.ssn 
      WHERE 
      ((DS BETWEEN .... AND ....) AND 
      (HS BETWEEN .... AND ....) AND 
      (MS BETWEEN .... AND ....)) 
    ) UCs 
    PIVOT (SUM (UC) for sN 
     IN (col2, col3, col4) 
    ) AS PVT 
) 
SELECT Language, col2, col3, col4, sum(Total) as Total 
FROM result 
UNION ALL 
SELECT 'TOTAL', sum(col2) as col2, sum(col3) as col3, cum(col4) as col4, sum(Total) as Total 
FROM result 

--method 2:

With result as (
    SELECT Language, col2, col3, col4, Total = col2 + col3 + col4 
    FROM ( SELECT xL.lN, xS.sN, UC.UC 
      FROM (UC LEFT JOIN xL ON UC.Language = xL.xL) LEFT JOIN xS 
      ON UC.ssn = xS.ssn 
      WHERE 
      ((DS BETWEEN .... AND ....) AND 
      (HS BETWEEN .... AND ....) AND 
      (MS BETWEEN .... AND ....)) 
    ) UCs 
    PIVOT (SUM (UC) for sN 
     IN (col2, col3, col4) 
    ) AS PVT 
) 
SELECT case when grouping(Language) = 1 then 'Total' else Language end as Language 
, sum(col2) as col2 
, sum(col3) as col3 
, sum(col4) as col4 
, sum(Total) as Total 
from result 
group by Language with Rollup 
order by grouping(Language)