Количество запросов между датами и статусом - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица продуктов, которая выглядит следующим образом:

ProductId(pKey) ProductTypeId
    1                 3
    2                 3
    3                 2
    4                 1
    5                 1

каждый раз, когда строка, вставленная в эту таблицу, показывает, что новый продукт был продан.

У меня только 3 ProductTypeId то, что фактически представляет серверы, которые мой клиент может отменить и отменить или удержать в статусе, и это приводит нас к таблице истории продуктов со статусом, которая выглядит следующим образом:

StatusId(pKey) ProductId StatusDate ProductStatus
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.

Моя цель - каждый месяц подсчитывать, сколько ProducsType было в статусе 1.

столбец StatusDate представляет дату, когда статус был изменен, поэтому в первый раз, когда покупатель покупает продукт / услуги, у него / нее будет ProductTypeId (1,2 или 3), который никогда не изменится, и ProductStatus из1, но может измениться в любое время в будущем.

результаты запроса должны выглядеть примерно так:

year     month      productId(1)     productId(2)     productId(3)
 2017      1              0               0                 1
 2017      2              0               0                 1(because the status not change)
 2017      3              0               0                 1
 2017      4              0               0                 1
 2017      5              0               0                 2
 2017      6              0               0                 2

и т. Д. *

Ответы [ 3 ]

2 голосов
/ 11 апреля 2019

Если вы ищете строки в столбцах и постоянный ProductTypeId. Это будет работать.

SELECT
    *
FROM
(
    SELECT 
        YEAR(s.StatusDate) AS 'Year',
        MONTH(s.StatusDate) AS 'MONTH',
        p.ProductTypeId
    FROM 
        Status s
        INNER JOIN Product p ON p.ProductId = s.ProductId
    WHERE
        s.ProductStatus = 1
    GROUP BY
        p.ProductTypeId,
        s.StatusDate
)p
PIVOT
(
COUNT(p.ProductTypeId)
FOR p.ProductTypeId IN([1],[2],[3])
)AS Pb
0 голосов
/ 11 апреля 2019

Это довольно сложно.Я предпочитаю считать значения на конкретную дату , а не в течение месяца.Это предотвращает многократный подсчет товара в течение месяца.

Следующее подсчитывает статусы в первый день каждого месяца.Его можно продлить на любое изменение в течение месяца, но это может привести к многократному учету одного продукта:

select v.dte,
       sum(case when h.status = 1 then 1 else 0 end) as status_1,
       sum(case when h.status = 2 then 1 else 0 end) as status_2,
       sum(case when h.status = 3 then 1 else 0 end) as status_3
from (values (convert(date, '2017-01-01')),
             (convert(date, '2017-02-01')),
             (convert(date, '2017-03-01')),
             (convert(date, '2017-04-01')),
             (convert(date, '2017-05-01')),
             (convert(date, '2017-06-01'))
     ) v(dte) left join
     (select h.*,
             lead(status_date) over (partition by productid order by status_date) as end_status_date
      from history h
     ) h
     on v.dte >= h.status_date and
        (v.dte < h.end_status_date or h.end_status_date)
group by v.dte
order by v.dte;
0 голосов
/ 11 апреля 2019

Я не проверял запрос, но он должен выглядеть примерно так:

SELECT YEAR(h.StatusDate),MONTH(h.StatusDate),COUNT(p1.ProductId),
       COUNT(p2.ProductId),COUNT(p3.ProductId)
FROM HistoryTable h
left join products p1 on p1.ProductId = h.ProductId and p1.ProductTypeId = 1
left join products p2 on p2.ProductId = h.ProductId and p2.ProductTypeId = 2
left join products p3 on p3.ProductId = h.ProductId and p3.ProductTypeId = 3
WHERE h.ProductStatus = 1
GROUP BY YEAR(h.StatusDate),MONTH(h.StatusDate)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...