私はこのクエリを持っています:
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
ただし、last合計行のみが必要です。必要ありませんin-reportsum's
それでは、どのようにして欲望の結果を得ることができますか?
(group by
句を変更することはできません。他の人も必要です。ロールアップの有無にかかわらず末尾に合計を追加したいだけです)。
GROUPING SETS
で可能です。これを試してください:
SELECT Name,datee,SUM (val)
FROM @t
GROUP BY
GROUPING SETS((NAME ,datee), ())
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()
はサポートされています。
最終合計だけが必要な場合は、UNION ALL
:
SELECT Name,datee,SUM (val)
from @t
GROUP BY NAME ,datee
union all
SELECT null,null,SUM (val)
from @t
または、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
)
結果は次のとおりです。
| 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 |
このクエリを使用できます:
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
)
)