ZetIndex_Ram
@ZetIndex_Ram

Создание представления для выдачи товарооборота по месяцам?

Есть у меня товар (название, единица измерения)
поставщик (название)
журнал покупок (ид, ид_товара, ид_поставщика, цена, количество (предполагается та же единица измерения, что и товар), дата_покупки (DATE))
журнал продаж (ид, ид_товара, ид_поставщика, цена, количество (предполагается та же единица измерения, что и товар), дата_продажи(DATE))

Мне нужно создать представление (виртуальную таблицу), которая бы мне выводила товарооборот по месяцам (под товароборотом понимается сумма денег (количество * цена), которая была получена в результате продаж за месяц)).

Таблицы
CREATE TABLE products (
idProduct INTEGER NOT NULL ,
title VARCHAR(255) UNIQUE NOT NULL,
measurement_unit VARCHAR(77) NOT NULL ,
PRIMARY KEY(idProduct));

CREATE TABLE providers (
idProvider INTEGER NOT NULL ,
title VARCHAR(77) NOT NULL UNIQUE,
some_address VARCHAR(77),
phone INTEGER NOT NULL,
PRIMARY KEY(idProvider));

CREATE TABLE sales (
idSale INTEGER NOT NULL ,
Product_idProduct INTEGER NOT NULL ,
sale_date DATE DEFAULT GETDATE(),
price INTEGER NOT NULL,
count INTEGER NOT NULL,
PRIMARY KEY(idSale),
FOREIGN KEY(Product_idProduct)
REFERENCES products(idProduct));


CREATE TABLE purchases (
idPurchase INTEGER NOT NULL ,
Product_idProduct INTEGER NOT NULL ,
Provider_idProvider INTEGER NOT NULL ,
count INTEGER NOT NULL,
purchase_date DATE ,
price INTEGER ,
PRIMARY KEY(idPurchase) ,
FOREIGN KEY(Provider_idProvider)
REFERENCES providers(idProvider),
FOREIGN KEY(Product_idProduct)
REFERENCES products(idProduct));
  • Вопрос задан
  • 151 просмотр
Решения вопроса 1
tsklab
@tsklab Куратор тега SQL Server
Здесь отвечаю на вопросы.
В соседнем вопросе я уже давал ссылку на календарный отчёт (простой). Используйте его как шаблон. И не забывайте, что PIVOT, это в некотором роде группировка. Сделайте запрос по sales и месяцам. SUM([price] * [count]) будет в ячейках, код продукта по вертикали. Потом добавите во внутренний запрос INNER JOIN к таблице products и вместо кода товара можете использовать его наименование.
Про товарооборот продумайте порядок: поставщик - товар или наоборот и нужно ли суммировать поступление и продажу или в месяце сделать две колонки. И ещё: год - сделать страницы по годам или ещё как?

Например, так:

SELECT [Year], [Product], [Январь], [Февраль], [Март], 
                          [Апрель], [Май], [Июнь], 
                          [Июль], [Август], [Сентябрь], 
                          [Октябрь], [Ноябрь], [Декабрь]
    FROM 
      ( SELECT YEAR(sale_date) AS [Year],
               products.title AS [Product], 
               DATENAME(MONTH, sale_date) AS [MonthName],
               price * count AS SaleSum
          FROM sales 
            INNER JOIN products ON sales.Product_idProduct = products.idProduct) AS enMonth
    PIVOT ( SUM(SaleSum)  
     FOR [MonthName] IN ( [Январь], [Февраль], [Март], 
                          [Апрель], [Май], [Июнь], 
                          [Июль], [Август], [Сентябрь], 
                          [Октябрь], [Ноябрь], [Декабрь])
          ) AS enPivot
  ORDER BY 1 DESC, 2

Русские названия месяцев:
SET LANGUAGE Russian;  
SELECT DATENAME(MONTH, 1), DATENAME(MONTH, 32), DATENAME(MONTH, 60)

Январь Февраль Март
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы