Сумма Суммы от столбцов до строк - PullRequest
0 голосов
/ 28 июня 2019

В настоящее время я суммирую данные по пяти столбцам с типом данных money. Столбцы Amount2, Amount3, Amount4, Amount5 должны отображаться в виде строк с соответствующей суммой.

В настоящее время результаты при выполнении запроса выглядят так:

enter image description here

но мне нужно, чтобы результаты отображались в следующем формате:

enter image description here

Кто-нибудь знает способ сделать это?

Я попробовал это, но не смог заставить его работать:

SELECT name, amount1, column
FROM
(
    select 
        Name,
        sum(Amount1) as Amount1,
        sum(Amount2) as Amount2,
        sum(Amount3) as Amount3,
        sum(Amount4) as Amount4,
        Sum(Amount5) as Amount5
    from 
        #temp
    group by
        Name
) d
UNPIVOT
(
  value
  for column in (Amount2,Amount3,Amount4,Amount5)
) unpiv;

Я получаю следующую ошибку:

Сообщение 156, Уровень 15, Состояние 1, Строка 54 Неверный синтаксис рядом с ключевым словом «ОТ».

Сообщение 102, Уровень 15, Состояние 1, Строка 67 Неверный синтаксис рядом с 'd'.

Пример данных

Create table #temp
(
    Name varchar(10),
    Amount1 money,
    Amount2 money,
    Amount3 money,
    Amount4 money,
    Amount5 money 
)

insert into #temp
(
    Name,
    Amount1,
    Amount2,
    Amount3,
    Amount4,
    Amount5
)
SELECT
    'Test',
    1,
    NULL,
    NULL,
    4,
    NULL
UNION ALL
SELECT
    'Test1',
    1,
    NULL,
    NULL,
    NULL,
    5
UNION ALL
SELECT
    'Test2',
    1,
    NULL,
    3,
    NULL,
    NULL
UNION ALL
SELECT
    'Test',
    1,
    2,
    NULL,
    NULL,
    NULL

select 
    Name,
    sum(Amount1) as Amount1,
    sum(Amount2) as Amount2,
    sum(Amount3) as Amount3,
    sum(Amount4) as Amount4,
    Sum(Amount5) as Amount5
from 
    #temp
group by
    Name

drop table #temp

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете просто использовать UNION ALL для каждого типа Amount

; with cte as
(
    select *
    from   #temp
)
select 
    Name,
    sum(Amount1) as Amount1
from 
    cte
group by
    Name

union all

select  'Amount2', sum(Amount2) from cte

union all

select  'Amount3', sum(Amount3) from cte

union all

select  'Amount4', sum(Amount4) from cte

union all

select  'Amount5', sum(Amount5) from cte
0 голосов
/ 28 июня 2019

В SQL Server самый простой (и, как правило, самый эффективный) метод - apply:

select v.*
from (select Name,
             sum(Amount1) as Amount1,
             sum(Amount2) as Amount2,
             sum(Amount3) as Amount3,
             sum(Amount4) as Amount4,
             sum(Amount5) as Amount5
      from #temp t
      group by Name
     ) n cross apply
     (values (Name, Amount1),
             ('Amount2', Amount2),
             ('Amount3', Amount3),
             ('Amount4', Amount4),
             ('Amount5', Amount5)
     ) v(Name, Amount)
where v.Amount is not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...