Расчет итогов в хранимой процедуре SQL по строкам из одной таблицы - PullRequest
2 голосов
/ 03 декабря 2011

Я пытаюсь построить хранимую процедуру, которая позволит мне вычесть значение, основанное на определенном условии, из другого значения, основанного на другом условии, но моя проблема заключается в том, что все строки находятся в одной таблице. Вероятно, легче показать вам, что я имею в виду.

Представьте, что у вас есть следующая таблица (для простоты она проста)

ID    Name     Total    Date
1     User1    5        20111106
2     User2    6        20111106
3     User3    7        20111105
4     User1    8        20111106
5     User3    4        20111117
6     User1    4        20111117
7     User5    1        20111105
8     User1    9        20111105
9     User3    5        20111106
10    User1    3        20111117

Сначала я хочу подвести итог по дате только для пользователя 1 и группы по дате.

Total     Date
9        20111105
13       20111106
7        20111117

Далее я хочу суммировать итоговую сумму по дате для всех остальных пользователей, кроме user1 и группы по дате

Total     Date
8         20111105
11        20111106
4         20111117

и, наконец, я хочу, чтобы моя хранимая процедура взяла вышеуказанные данные и выдала мне следующее. Я хочу вычесть сумму, полученную от "User1", из суммы, полученной от всех других пользователей, но используя дату в качестве параметра соответствия.

и конечный результат будет следующим:

Total     Date
-1        20111105
-2        20111106
-3        20111117

Имеет ли это смысл ???

Спасибо.

Т.

Ответы [ 3 ]

2 голосов
/ 03 декабря 2011

Это похоже на работу.

with User1Totals as 
(
  select [Name], sum(Total) as Total, [Date]
  from YourTable
  where [Name] = 'User1'
  group by [Name], [Date]
), 
OtherUsersTotals as
(
  select sum(Total) as Total, [Date]
  from YourTable
  where [Name] <> 'User1'
  group by [Date]
)

select isnull(t2.Total, 0) - isnull(t1.Total, 0), coalesce(t2.[Date], t1.[Date])
from User1Totals t1
full outer join OtherUsersTotals t2 on t1.[Date] = t2.[Date]
​

Это обрабатывает сценарии в ваших образцах данных, а также два других сценария - 1) когда у User1 есть запись в день, которого нет у других пользователей, и 2) когда у других пользователей есть данные в день, которого User1 не имеет. .

Рабочий пример здесь - http://data.stackexchange.com/stackoverflow/q/120224/

1 голос
/ 03 декабря 2011

Я думаю, что это будет работать ...

DECLARE @Name VARCHAR(20)
SET @Name='User1'
SELECT
    SUM(
        CASE
            WHEN Name=@Name THEN Total*-1
            ELSE Total
        END
    ) [Total Adj]
    ,Date
FROM Table
GROUP BY Date
0 голосов
/ 03 декабря 2011

Вы можете достичь этого результата, создав временные таблицы.

Шаг # 01: Создайте таблицу temp1 и внесите в нее свой первый требуемый результат только для пользователя 1.

CREATE TABLE Temp1
(
ID IDENTITY (1, 1) NOT NULL,
Total int,
Date datetime)

insert into Temp1(Total , Date)
values (select sum(Total) as Total , Date where Name = 'user1' group by Date order by Date asc)

Шаг № 02: Создайте таблицу temp2 и заполните ее другой информацией пользователя.

CREATE TABLE Temp2
(
ID IDENTITY (1, 1) NOT NULL,
Total int,
Date datetime)

insert into Temp1(Total , Date)
values (select sum(Total) as Total , Date where Name is not 'user1' group by Date

упорядочить по дате asc)

Шаг # 03: Теперь вычитайте записи и удаляйте временные таблицы.

select (t2.Total - t1.Total) as Total , Date  from temp2 t2
inner join temp1 t1 on t1.ID = t2.ID;

drop table temp1;
drop table temp2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...