Сумма с SQL Server RollUP - но только последнее резюме? - программирование
Подтвердить что ты не робот

Сумма с SQL Server RollUP - но только последнее резюме?

У меня есть этот запрос:

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 в конец. Поэтому я попробовал с rollup:

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

enter image description here

НО мне нужна только последняя общая сумма. Мне не нужен in-report sum's

Итак, как получить результат желания?

(Я не могу изменить предложение group by, потому что другим это нужно, я просто хочу добавить сумму в конце с/без rollup).

sql онлайн здесь

4b9b3361

Ответ 1

Возможно, с помощью GROUPING SETS попробуйте следующее:

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

SQL Fiddle

Ответ 2

Это также возможно с 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() есть.

Ответ 3

Если вы просто хотите получить итоговую сумму, не можете ли вы просто использовать 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
)

См. SQL Fiddle with Demo

Результат:

|   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

Вы можете использовать этот запрос:

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
             )
        )