Суммирование на индивидуальном и общем уровне - PullRequest
0 голосов
/ 07 сентября 2018

У меня есть что-то как

enter image description here

Ищем вывод как

enter image description here

Я пытался использовать RollUp, cube, Grouping Set, но, похоже, ничего не подходит.

Вот моя неудачная попытка:

declare @t table(

[Employee Name] varchar(50),Bucket int,
[Start Inventory No] int ,[Start Inventory Amount] int,
[No Of Promise to Pay] int,[Promise to Pay Amount] int)

insert into @t 
    select 'A', 0,10,10000,3,100 union all
    select 'A', 1,20,20000,7,500 union all
    select 'B', 0,45,90000,4,200 union all
    select 'B', 1,12,70000,6,600 union all
    select 'c', 0,16,19000,1,500 union all
    select 'c', 1,56,9000,10,2500

select 
    [Employee Name] 
    ,Bucket=case when x.rn= 11 then 'total' else Bucket end
    ,[Start Inventory No]= case when x.rn= 11 then sum([Start Inventory No]) else [Start Inventory No] end

from 
(select 
rn=ROW_NUMBER() Over(partition by [Employee Name] order by (select 1)), 
    *
from @t
GROUP BY 
        Rollup
        ([Employee Name] ,Bucket,[Start Inventory No],[Start Inventory Amount],[No Of Promise to Pay],
        [Promise to Pay Amount]))X where x.Rn in (1,6,11)

group by [Employee Name] 
    ,Bucket, rn

1 Ответ

0 голосов
/ 08 сентября 2018

Это должно быть сделано с помощью сводной таблицы на клиенте, а не на сервере.

Если по какой-то причине вы хотите попасть на второй стол с первого, я бы сделал это как

select
  case when grouping(fake_column) = 1 then null else [Employee Name] end as [Employee Name],
  case when grouping([Employee Name]) = 1 and grouping(fake_column) = 1 then 'Gran Total' when grouping(fake_column) = 1 then 'Total' else cast(sum(Bucket) as varchar) end as Bucket,
  sum([Start Inventory No]) as [Start Inventory No],
  sum([Start Inventory Amount]) as [Start Inventory Amount],
  sum([No Of Promise to Pay]) as [No Of Promise to Pay],
  sum([Promise to Pay Amount]) as [Promise to Pay Amount]
from
  (select *, row_number() over(partition by [Employee Name] order by 1/0) as fake_column from @t) data
group by
  rollup([Employee Name], fake_column)
;

Идея состоит в том, что вы делаете каждую строку уникальной, вводя поддельный столбец, и включаете этот столбец в группировку, чтобы исходные строки также выглядели как «сгруппированные» результаты (каждая «группа» содержит одну строку из-за уникальный номер).

...