web-dev-qa-db-ja.com

合計を含むサマリー行を追加する

これはおかしく聞こえるかもしれませんし、おそらくこの方法で行うべきではありませんが、このようなものが必要です-SELECT [Type], [Total Sales] From Beforeのレコードがあります

テーブルの最後にSUMを表示するために、最後に余分な行を追加したい(後)。これはできますか?

enter image description here

50
user2103670

SQL Server 2008以降のバージョンを使用している場合は、 ROLLUP() GROUP BY関数を使用できます。

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

これは、Type列にNULLを含めることはできないため、このクエリのNULLは総計のあるロールアップ行を示すことを前提としています。ただし、Type列に独自のNULLを含めることができる場合、合計行に対するより適切なタイプのアカウンティングは@Declan_Kの答えのようになります。つまり、 GROUPING() 関数を使用します。

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

これは、SQL Server 2008+で使用するより強力なグループ化/ロールアップ構文です。推測する必要がないように、使用しているバージョンを指定すると常に便利です。

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

Craig Freedmanは GROUPING SETSを紹介する素晴らしいブログ投稿 を書きました。

18
Aaron Bertrand

以下のようにunion allを使用してみてください

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

i-oneが提案するように、順序付けに問題がある場合は、これを試してください:

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

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