web-dev-qa-db-ja.com

SQLサーバーロールアップとの合計-ただし、最後の要約のみ?

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

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 

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

enter image description here

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

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

enter image description here

ただし、last合計行のみが必要です。必要ありませんin-reportsum's

それでは、どのようにして欲望の結果を得ることができますか?

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

SQLオンラインはこちら

18
Royi Namir

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

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

SQL Fiddle

33
Ivan G

ROLLUP()でも可能です:

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

_WITH ROLLUP_は_WITH CUBE_と同様に非標準であり、非推奨です。 ( _GROUP BY_ マニュアルの非ISO準拠構文を参照してください。)

ROLLUP()は、SQL Server 2005の90未満またはSQL Server 2008+の100未満の互換性レベルではサポートされていませんが、GROUPING SETS()はサポートされています。

10
Andriy M

最終合計だけが必要な場合は、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 |
4
Taryn

このクエリを使用できます:

SELECT  *
FROM    ( SELECT    Name ,
                    datee ,
                    SUM(val) summ
          FROM      @t
          GROUP BY  NAME ,
                    datee
                    WITH ROLLUP
        ) A
WHERE   ( datee IS NOT NULL
          OR ( datee IS NULL
               AND name IS NULL
             )
        )
1
Shyam Prasad