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));
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)
Январь Февраль Март