23

私はこのクエリを持っています:

DECLARE @t TABLE(NAME NVARCHAR(MAX),datee date,val money)

insert INTO @t SELECT 'a','2012-01-02',100
insert INTO @t SELECT 'a','2012-01-02',100
insert INTO @t SELECT 'a','2012-01-03',100
insert INTO @t SELECT 'a','2012-01-05',100
insert INTO @t SELECT 'b','2012-01-06',200
insert INTO @t SELECT 'b','2012-01-07',200
insert INTO @t SELECT 'd','2012-01-07',400
insert INTO @t SELECT 'e','2012-01-09',500
insert INTO @t SELECT 'f','2012-01-12',600

SELECT  Name,datee,SUM (val) 
from @t GROUP BY NAME ,datee 

現在、結果は次のとおりです。

ここに画像の説明を入力

sumしかし、最後に追加する必要があります。だから私はロールアップで試しました:

 SELECT  Name,datee,SUM (val) 
    from @t GROUP BY NAME ,datee  with ROLLUP

ここに画像の説明を入力

しかし、最後の合計行だけが必要です。インレポートはいらない sum's

では、どうすれば欲望の結果を得ることができるのでしょうか?

(他の人もそれを必要とするため、句を変更する group byことはできません。ロールアップの有無にかかわらず、最後に合計を追加したいだけです)。

SQLオンラインはこちら

4

4 に答える 4

41

で可能ですGROUPING SETS。これを試してください:

SELECT  Name,datee,SUM (val) 
FROM    @t 
GROUP BY 
        GROUPING SETS((NAME ,datee), ())

SQL フィドル

于 2013-01-23T11:27:32.033 に答える
12

次の場合も可能ROLLUP()です。

SELECT
  Name,
  datee,
  SUM (val) 
FROM @t 
GROUP BY 
  ROLLUP((NAME, datee))
;

WITH ROLLUPWITH CUBEおよび は非標準で非推奨です。(マニュアルの非 ISO 準拠の構文を参照してください。)GROUP BY

ROLLUP()SQL Server 2005 では 90 未満、SQL Server 2008+ では 100 未満の互換性レベルではサポートされていませんが、サポートされていることに注意してくださいGROUPING SETS()

于 2013-01-23T12:36:49.827 に答える
4

最終的な合計だけが必要な場合は、次を使用できませんかUNION ALL:

SELECT  Name,datee,SUM (val) 
from @t 
GROUP BY NAME ,datee 
union all
SELECT  null,null,SUM (val) 
from @t

デモで SQL Fiddle を参照してください

または、句を使用して値WHEREで行をフィルタリングできます。null

select name, 
  datee, 
  total
from
(
  SELECT  Name,datee,SUM (val) total
  from @t 
  GROUP BY NAME, datee with rollup
) src
where datee is not null
or
(
  name is null 
  and datee is null
)

デモで SQL Fiddle を参照してください

結果は次のとおりです。

|   NAME |      DATEE | COLUMN_2 |
----------------------------------
|      a | 2012-01-02 |      200 |
|      a | 2012-01-03 |      100 |
|      a | 2012-01-05 |      100 |
|      b | 2012-01-06 |      200 |
|      b | 2012-01-07 |      200 |
|      d | 2012-01-07 |      400 |
|      e | 2012-01-09 |      500 |
|      f | 2012-01-12 |      600 |
| (null) |     (null) |     2300 |
于 2013-01-23T11:19:14.010 に答える