Ответ 1
Возможно, с помощью GROUPING SETS
попробуйте следующее:
SELECT Name,datee,SUM (val)
FROM @t
GROUP BY
GROUPING SETS((NAME ,datee), ())
У меня есть этот запрос:
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
в конец.
Поэтому я попробовал с rollup:
SELECT Name,datee,SUM (val)
from @t GROUP BY NAME ,datee with ROLLUP
НО мне нужна только последняя общая сумма. Мне не нужен in-report sum's
Итак, как получить результат желания?
(Я не могу изменить предложение group by
, потому что другим это нужно, я просто хочу добавить сумму в конце с/без rollup).
Возможно, с помощью 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
, являются нестандартными и устаревшими. (См. Синтаксис, не соответствующий ISO, в руководстве GROUP BY
.)
Следует отметить, что ROLLUP()
не поддерживается в уровне совместимости под 90 в SQL Server 2005 или менее 100 в SQL Server 2008+, тогда как GROUPING SETS()
есть.
Если вы просто хотите получить итоговую сумму, не можете ли вы просто использовать UNION ALL
:
SELECT Name,datee,SUM (val)
from @t
GROUP BY NAME ,datee
union all
SELECT null,null,SUM (val)
from @t
Смотрите SQL Fiddle with Demo
Или вы можете использовать предложение 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
)
)