Мне нужна хранимая процедура, которая считает между датами и статусом.
У меня есть таблица products
, которая выглядит следующим образом:
ProductId(PK) ProductTypeId(FK)
-------------------------------
1 3
2 3
3 2
4 1
5 1
Каждый раз, когда в эту таблицу products
вставляется строка, это означает, что новый продукт был продан.
У меня есть только 3 типа продуктов в столбце ProductTypeId
, которые фактически представляют серверы, которые мой клиент может отменить и отменить или приостановить, и это приводит нас к таблице истории продуктов, которая выглядит следующим образом. :
«Таблица состояния истории»:
StatusId(PK) ProductId(FK) StatusDate ProductStatus(FK)
1 ,1 ,1-1-17 ,1
2 ,1 ,2-12-17 ,2
3 ,2 ,21-5-17 ,1
4 ,3 ,11-5-18 ,1
5 ,2 ,18-5-18 ,2
6 ,2 ,10-8-18 ,3
У меня есть только 3 типа статуса (поле «ProductStatus») 1,2,3.
Поле «StatusDate» представляет дату, когда статус был изменен, поэтому, когда клиент впервые покупает продукт / его услуги, у него / нее будет «ProductTypeId» (1,2 или 3), который никогда не изменится, и «ProductStatus» равен 1, но может измениться в любое время в будущем.
Иногда мои клиенты хотят отменить (ProductStatus = 3) продукт / подачу или быть в состоянии «Удерживать» (ProductStatus = 2), и когда это произойдет, новая строка будет добавлена в «таблицу состояния истории» с дата изменения статуса (поле «StatusDate»).
Моя цель - подсчитать, сколько ProductType
находится в статусе 1 (активно) каждый месяц (31-е число в месяце).
Таким образом, если у нас есть продукт в статусе 1 в 01.01.19 и статус не изменялся до 18/4/19, это означает, что мне нужно его подсчитать в январе, феврале и марте.
Результаты хранимой процедуры должны выглядеть примерно так:
year month productId(1) productId(2) productId(3)
-------------------------------------------------------------------
2017 1 0 0 1
2017 2 0 0 1
2017 3 0 0 1
2017 4 0 0 1
2017 5 0 0 2
2017 6 0 0 2
и т. Д.
Структура таблицы:
CREATE TABLE [dbo].[tbl_SalesProducts]
(
[ProductId] [int] IDENTITY(1,1) NOT NULL,
[ProductTypeId] [tinyint] NOT NULL,
CONSTRAINT [PK_tbl_SalesProducts]
PRIMARY KEY CLUSTERED ([ProductId] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
CREATE TABLE [dbo].[tbl_SalesProductStatusHistory]
(
[StatusId] [int] IDENTITY(1,1) NOT NULL,
[ProductId] [int] NOT NULL,
[StatusDate] [date] NOT NULL,
[ProductStatus] [tinyint] NOT NULL,
CONSTRAINT [PK_tbl_SalesProductStatus]
PRIMARY KEY CLUSTERED ([StatusId] ASC)
WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET IDENTITY_INSERT [dbo].[tbl_SalesProducts] ON
GO
INSERT INTO [dbo].[tbl_SalesProducts] ([ProductId], [ProductTypeId])
VALUES (1, 1), (2, 3), (3, 2), (4, 1), (5, 1)
GO
SET IDENTITY_INSERT [dbo].[tbl_SalesProducts] OFF
GO
SET IDENTITY_INSERT [dbo].[tbl_SalesProductStatusHistory] ON
GO
INSERT INTO [dbo].[tbl_SalesProductStatusHistory] ([StatusId], [ProductId], [StatusDate], [ProductStatus])
VALUES (1, 1, CAST(N'2017-12-23' AS Date), 1),
(2, 2, CAST(N'2018-01-02' AS Date), 1),
(4, 1, CAST(N'2018-02-18' AS Date), 2),
(5, 3, CAST(N'2018-03-19' AS Date), 1),
(6, 4, CAST(N'2018-04-24' AS Date), 1),
(7, 2, CAST(N'2018-04-07' AS Date), 3),
(8, 5, CAST(N'2018-07-09' AS Date), 1)
GO
SET IDENTITY_INSERT [dbo].[tbl_SalesProductStatusHistory] OFF
GO
ALTER TABLE [dbo].[tbl_SalesProducts] WITH CHECK
ADD CONSTRAINT [FK_tbl_SalesProducts_tbl_Products]
FOREIGN KEY([ProductTypeId]) REFERENCES [dbo].[tbl_Products] ([MezaeeMuzar])
GO
ALTER TABLE [dbo].[tbl_SalesProducts] CHECK CONSTRAINT [FK_tbl_SalesProducts_tbl_Products]
GO
ALTER TABLE [dbo].[tbl_SalesProductStatusHistory] WITH CHECK
ADD CONSTRAINT [FK_tbl_SalesProductStatus_tbl_SalesProducts]
FOREIGN KEY([ProductId]) REFERENCES [dbo].[tbl_SalesProducts] ([ProductId])
GO
ALTER TABLE [dbo].[tbl_SalesProductStatusHistory] CHECK CONSTRAINT [FK_tbl_SalesProductStatus_tbl_SalesProducts]
GO
ALTER TABLE [dbo].[tbl_SalesProductStatusHistory] WITH CHECK
ADD CONSTRAINT [FK_tbl_SalesProductStatusHistory_tbl_SalesProductsStatus]
FOREIGN KEY([ProductStatus]) REFERENCES [dbo].[tbl_SalesProductStatus] ([MezaeeStatusMuzar])
GO
ALTER TABLE [dbo].[tbl_SalesProductStatusHistory] CHECK CONSTRAINT [FK_tbl_SalesProductStatusHistory_tbl_SalesProductsStatus]
GO