Пытаюсь посчитать в SQL MTD стоимость стола.
У меня есть следующая таблица:
| год | пользователь | месяц | тип | Стоимость | пустой |
|---|---|---|---|---|---|
| 2021 | а | 1 | Тип 1 | 10 | 0 |
| 2021 | а | 2 | Тип 1 | 20 | 0 |
| 2021 | а | 3 | Тип 1 | 35 | 0 |
| 2022 | а | 1 | Тип 1 | 5 | 0 |
| 2022 | а | 2 | Тип 1 | 35 | 0 |
| 2021 | б | 1 | Тип 1 | 10 | 0 |
| 2021 | б | 2 | Тип 1 | 30 | 0 |
Теперь мне нужно иметь стоимость MTD по годам, пользователям и типам.
| год | пользователь | месяц | тип | Стоимость | стоимостьMTD | пустой |
|---|---|---|---|---|---|---|
| 2021 | а | 1 | Тип 1 | 10 | 10 | 0 |
| 2021 | а | 2 | Тип 1 | 20 | 10 | 0 |
| 2021 | а | 3 | Тип 1 | 35 | 15 | 0 |
| 2022 | а | 1 | Тип 1 | 5 | 5 | 0 |
| 2022 | а | 2 | Тип 1 | 35 | 30 | 0 |
| 2021 | б | 1 | Тип 1 | 10 | 10 | 0 |
| 2021 | б | 2 | Тип 1 | 30 | 20 | 0 |
Могу ли я сделать это с запросом в SQL?
я пробовал так, но это не работает:
SELECT t1.year, t1.user, t1.month, t1.type, t1.cost,
iif (t1.month = '1', t1.cost, t1.cost- t2.cost) AS costMTD, 0 AS blank
FROM dbo.usercosts AS t1 INNER JOIN dbo.usercosts AS t2
ON t1.year = t2.year
AND t1.user= t2.user
AND t1.type= t2.type
AND t2.month = iif (t2.month = '1', '1', t1.month - 1)
Спасибо


Вы можете использовать LAG, чтобы увидеть стоимость предыдущей строки.
select
year, user, month, type, cost,
cost - coalesce(lag(cost) over(partition by user order by year, month), 0) as costmtd,
0 as blank
from dbo.usercosts as
order by user, year, month;
Идеальный. Большое вам спасибо: D, что решили мою проблему. Мне просто нужно было отрегулировать 1 мелочь. in ...over(partition by user .... тип отсутствует. Вот скорректированный код, который отлично работал: cost- COALESCE (lag(cost) OVER (partition BY user, type ORDER BY year, type, month), 0) КАК стоит
Какую СУБД вы используете? Я опубликовал стандартный ответ SQL, который должен работать в большинстве СУБД, но рекомендуется (на самом деле, скорее требуется) помечать запросы SQL с помощью MBS, на которую они ссылаются.