Хранимая процедура, которая считает между датами и статусом - PullRequest
0 голосов
/ 07 мая 2019

Мне нужна хранимая процедура, которая считает между датами и статусом.

У меня есть таблица 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...