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 dossier de SELECT [Type], [Total Sales] From Before
Je veux append une ligne supplémentaire à la fin pour montrer la sum à la fin de la table (après). Cela pourrait-il être fait?
Si vous utilisez SQL Server 2008 ou 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 des valeurs NULL et que la valeur NULL dans cette requête indiquerait la ligne de cumul, celle avec le total général. Cependant, si la colonne Type
peut avoir des valeurs NULL, le type de comptabilité le plus approprié pour la ligne totale serait comme dans la réponse de @ Declan_K, c'est-à-dire en utilisant la fonction GROUPING()
:
SELECT Type = CASE GROUPING(Type) WHEN 1 THEN 'Total' ELSE Type END, TotalSales = SUM(TotalSales) FROM atable GROUP BY ROLLUP(Type) ;
C'est la syntaxe de groupement / rollup plus puissante que vous voudrez utiliser dans SQL Server 2008+. Toujours utile pour spécifier la version que vous utilisez afin que nous n'ayons pas à deviner.
SELECT [Type] = COALESCE([Type], 'Total'), [Total Sales] = SUM([Total Sales]) FROM dbo.Before GROUP BY GROUPING SETS(([Type]),());
Craig Freedman a écrit un excellent article de blog présentant GROUPING SETS
.
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 command, comme je l'ai suggéré, essayez 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
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