2013-07-29 71 views
35

我知道這聽起來很瘋狂,也許不應該做這樣的方式,但我需要的是這樣的 - 我有一個記錄從SELECT [Type], [Total Sales] From Before添加摘要行以總計

我想在最後添加一個額外的行在表格末尾顯示SUM(After)。這可以做到嗎?

enter image description here

+1

SQL Server有分類彙總支持: [請參閱彙總](http://msdn.microsoft.com/en-us/library/ms189305%28v=sql.90%29.aspx)。 –

回答

35

如果你是SQL Server 2008或更高版本上,您可以使用ROLLUP() GROUP BY功能:

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

這假定Type列不能有NULL值,因此在此查詢的NULL將指示彙總行,總計行。但是,如果Type列都可以有自己的空值,總排越正確類型的會計將是@ Declan_K的答案,即使用GROUPING()功能,如:

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

嘗試使用union all如下

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

,如果你有一個排序問題,因爲我一建議試試這個:

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 
+0

這裏有一點需要注意,如果Type的值是字母(U,V,W等)後面的字母總數,那麼Total行可能不會出現在最下面一行... – Sparky

+0

我同意@Sparky,這樣它應該成爲例如從[SELECT] [類型],[總銷售額],[關鍵]選擇[類型],[總銷售額]從合併之前全部選擇'總計',總和([總銷售額]),1從前) [Key],類型' –

+0

不知道[Type]的可能值,Cast()到VarChar(5)將不會真正解決它。 i-one顯示正確的解決方案,添加了數字計數器以強制排序順序... – Sparky

10

你可以使用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 
14

這是您希望在SQL Server 2008+中使用的更強大的分組/彙總語法。對指定您使用的版本總是有用的,所以我們不必猜測。

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

克雷格弗裏德曼寫道a great blog post introducing GROUPING SETS

+0

好東西,謝謝分享! –