web-dev-qa-db-fra.com

Ajouter une ligne de résumé avec les totaux

Je sais que cela semble fou et ne devrait probablement pas être fait de cette façon, mais j'ai besoin de quelque chose comme ça: j'ai un disque de SELECT [Type], [Total Sales] From Before

Je veux ajouter une ligne supplémentaire à la fin pour afficher le SOMME à la fin du tableau (Après). Cela pourrait-il être fait?

enter image description here

50
user2103670

Si vous utilisez SQL Server 2008 ou une version ultérieure, vous pouvez utiliser la fonction ROLLUP() GROUP BY:

SELECT
  Type = ISNULL(Type, 'Total'),
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;

Cela suppose que la colonne Type ne peut pas avoir de valeur NULL et que la valeur NULL de cette requête indique la ligne de cumul, celle avec le total général. Cependant, si la colonne Type peut avoir sa propre valeur NULL, le type de comptabilisation le plus approprié pour la ligne de total serait comme dans la réponse de @Declan_K, c’est-à-dire en utilisant le GROUPING() fonction:

SELECT
  Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END,
  TotalSales = SUM(TotalSales)
FROM atable
GROUP BY ROLLUP(Type)
;
50
Andriy M

Il s'agit de la syntaxe de regroupement/correctif la plus puissante que vous souhaiterez utiliser dans SQL Server 2008+. Il est toujours utile de spécifier la version que vous utilisez pour ne pas avoir à deviner.

SELECT 
  [Type] = COALESCE([Type], 'Total'), 
  [Total Sales] = SUM([Total Sales])
FROM dbo.Before
GROUP BY GROUPING SETS(([Type]),());

Craig Freedman a écrit n excellent article de blog présentant GROUPING SETS .

18
Aaron Bertrand

Essayez d'utiliser union all comme ci-dessous

SELECT [Type], [Total Sales] From Before
union all
SELECT 'Total', Sum([Total Sales]) From Before

si vous avez un problème avec la commande, comme i-one suggéré d'essayer ceci:

select [Type], [Total Sales] 
from (SELECT [Type], [Total Sales], 0 [Key] 
      From Before 
      union all 
      SELECT 'Total', Sum([Total Sales]), 1 From Before) sq 
order by [Key], Type
15
Parado

Vous pouvez utiliser l'opérateur ROLLUP

SELECT  CASE 
            WHEN (GROUPING([Type]) = 1) THEN 'Total'
            ELSE [Type] END AS [TYPE]
        ,SUM([Total Sales]) as Total_Sales
From    Before
GROUP BY
        [Type] WITH ROLLUP
12
Declan_K