T-SQL INSERT - Увеличивать значение, когда дублируются другие столбцы - PullRequest
0 голосов
/ 18 января 2019

У меня есть следующая таблица:

CREATE TABLE Budget (
Year Int,
Region varchar(50),
Amount float,
DraftNo int);

GO

INSERT INTO Budget 
VALUES
(2018, 'Region1', 500000, 1),
(2018, 'Region2', 400000, 1),
(2018, 'Region3', 300000, 1);

Конечные пользователи будут отправлять данные для года, региона и суммы через форму Excel, которая будет использовать VBA для записи операторов INSERT в таблицу. По умолчанию значение DraftNo будет равно 1, но если в первых двух столбцах (год и регион) уже есть совпадение в таблице, я хочу увеличить значение DraftNo на единицу каждый раз.

Например, если приложение пытается написать:

INSERT INTO Budget VALUES (2018, 'Region1', 600000, 1)

Должен быть преобразован в:

INSERT INTO Budget VALUES (2018, 'Region1', 600000, 2)

Конечно, решение также должно будет распознавать максимальный номер черновика для комбинации Год / Регион и увеличивать еще один оттуда, вместо того, чтобы всегда использовать 2.

1 Ответ

0 голосов
/ 18 января 2019

Если вам нужно добавить новую запись с инкрементным черновиком:

declare @y int = 2018, @r varchar(50) = 'Region6', @a float = 3

INSERT INTO Budget VALUES (@y, @r, @a, isnull((select max(DraftNo) from Budget where [Year] = @y and Region = @r), 0) + 1)

Если вам нужно обновить существующие записи и добавить DraftNo:

Использование MERGE:

merge Budget as trg
using (select 2018, 'Region1', 600000) as src (y, r, a)
on trg.[Year] = src.y and trg.[Region] = src.r and trg.Amount = src.a
when matched then
    update set DraftNo = DraftNo + 1
when not matched then
    insert ([Year], Region, Amount, DraftNo)
    values (y, r, a, 1);

Использование Update + Insert:

declare @y int = 2018, @r varchar(50) = 'Region6', @a float = 3

update Budget 
set DraftNo = DraftNo + 1
where [Year] = @y and [Region] = @r and Amount = @a

if @@ROWCOUNT = 0
    insert Budget (Year, Region, Amount, DraftNo)
    values (@y, @r, @a, 1)
...