Как создать View с обобщенным количеством товара?

Рейтинг: 0Ответов: 1Опубликовано: 29.10.2014

Есть три таблицы: таблица с товарами и две таблицы с операциями над товарами - добавление и удаление.

--таблица с предметами
CREATE TABLE ItemSet (
    ItemId int IDENTITY(1,1) NOT NULL,
    ItemName nvarchar(max)  NOT NULL,
   );

--таблица учета добавления
CREATE TABLE IncSet (
    IncId int IDENTITY(1,1) NOT NULL,
    IncDate datetime  NOT NULL,
    IncAmount decimal(18,0)  NOT NULL,
    IncPrice decimal(18,0)  NOT NULL,
    ItemItemId int  NOT NULL
);

-- Таблица учета расходования
CREATE TABLE DecSet (
    DecId int IDENTITY(1,1) NOT NULL,
    DecDate datetime  NOT NULL,
    DecCount decimal(18,0)  NOT NULL,
    DecCommet nvarchar(max)  NOT NULL,
    ItemItemId int  NOT NULL
);

Хочу создать View, который будет показывать количество предметов, имеющихся в наличии. То есть нужно сложить весь приход и вычесть расход.

Ответы

▲ 3Принят

С вашей структурой так:

create view ItemCount as
select i.itemid, sum(c.count)
from ItemSet i
  left join (select ItemItemId, sum(IncAmount) as count
             from IncSet 
             group by ItemItemId
             union all 
             select ItemItemId, sum(DecCount) 
             from DecSet 
             group by ItemItemId) as c on i.ItemId = c.ItemItemId
group by i.ItemId

NB. Это если DecCount у вас отрицательный, если положительный, то -sum(DecCount).

А с правильной структурой:

CREATE TABLE MoveSet (
    Id int IDENTITY(1,1) NOT NULL,
    MoveDate datetime  NOT NULL,
    Amount decimal(18,0)  NOT NULL,
    ItemId int  NOT NULL
);

Так:

create view ItemCount as
select id, sum(Amount) from MoveSet
group by id

Если вам надо вести суммовой учет, то надо хранить не цену, а сумму. При приходе сумма=количество*цена, а при расходе списывать партиями, там суммы будут рассчитываться в зависимости от учетной политики (фифо, лифо, по средней).
На данный момент ваша цена пользы никакой не приносит. Понять, сколько у вас товара на складе по сумме лежит, нельзя, по какой себестоимости вы будете отпускать товар тоже, т.е. чисто справочное поле, никак не помогающее в учете.