SQL Запрос значений статуса журнала - PullRequest
0 голосов
/ 06 августа 2020

Хорошо, в основном у меня есть таблица (OfferStatusLogs), как описано ниже. Я хочу подсчитать количество предложений, имевших статус «В рамках контракта» в любой предоставленный месяц, при условии, что оно не было впоследствии отменено.

Условия: Если предложение истекает по контракту дважды в месяц ( первый отменен), который считается только как один, и если предложение идет по контракту, а затем отменяется, оно не засчитывается.

До сих пор мне удалось получить только количество предложений по контракту через месяц, но не знаю, как отфильтровать их, если они были отменены позже.

Столбцы OfferStatusLogs

  • ID
  • LogStatus
  • OfferID
  • LogDate

Значения LogStatus

  • Создано
  • По контракту
  • Закрыто
  • Отменено

Текущий запрос:

SELECT      max(os.LogDate) AS LastUCDate,
            os.OfferStatusLogType_Type AS LogType, 
            os.OfferStatusLogType_Code AS LogCode

FROM        dbo.OfferStatusLogs AS os
            
WHERE       os.LogStatus = 'Under Contract'

GROUP BY    os.OfferStatusLogType_Type, os.OfferStatusLogType_Code

Пример данных:

ID     LogStatus     LogDate     OfferId
1      Created       2020-01-01  1
2      UnderContract 2020-01-03  1
3      Cancelled     2020-01-04  1
4      Created       2020-01-06  2
5      UnderContract 2020-01-07  2
6      Closed        2020-01-08  2
7      UnderContract 2020-01-10  1
8      Closed        2020-01-11  1
9      Created       2020-01-12  3
10     UnderContract 2020-01-13  3
11     Cancelled     2020-01-14  3

Желаемые результаты:

Month     UnderContract
Jan, 20   2

Ответы [ 2 ]

1 голос
/ 07 августа 2020

В моем тестировании это работает и дает желаемый результат.

SELECT FORMAT(os.LogDate, 'MMM') + ' ' + CAST(YEAR(os.LogDate) AS varchar) AS [Month], COUNT(*) AS UnderContract 
FROM dbo.OfferStatusLogs os
WHERE os.LogStatus = 'UnderContract' AND os.OfferID NOT IN 
(SELECT OfferID FROM dbo.OfferStatusLogs WHERE OfferID=os.OfferID AND LogDate>os.LogDate AND LogStatus='Cancelled')
GROUP BY FORMAT(os.LogDate, 'MMM') + ' ' + CAST(YEAR(os.LogDate) AS varchar)
0 голосов
/ 07 августа 2020

Здесь я проделал следующие действия.

  1. Получите количество предложений «Недоговора» в том же месяце
  2. Максимальные и минимальные значения «Недоговора» и «Отменено» одинаковы предложение.
  3. Поместите их в предложение CASE WHEN и дайте им числа в качестве условий и назовите этот новый столбец как FLAG.
  4. Затем просуммируйте эти значения.
WITH MAIN AS (
select 1  as id,    'Created' as LogStatus, CONVERT(DATETIME, '2020-01-01',111) as LogDate, 1 as OfferId union all 
select 2  as id,    'UnderContract' as LogStatus, CONVERT(DATETIME, '2020-01-03',111) as LogDate, 1 as OfferId union all 
select 3  as id,    'Cancelled' as LogStatus, CONVERT(DATETIME, '2020-01-04',111) as LogDate, 1 as OfferId union all 
select 4  as id,    'Created' as LogStatus, CONVERT(DATETIME, '2020-01-06',111) as LogDate, 2 as OfferId union all 
select 5  as id,    'UnderContract' as LogStatus, CONVERT(DATETIME, '2020-01-07',111) as LogDate, 2 as OfferId union all 
select 6  as id,    'Closed' as LogStatus, CONVERT(DATETIME, '2020-01-08',111) as LogDate, 2 as OfferId union all 
select 7  as id,    'UnderContract' as LogStatus, CONVERT(DATETIME, '2020-01-10',111) as LogDate, 1 as OfferId union all 
select 8  as id,    'Closed' as LogStatus, CONVERT(DATETIME, '2020-01-11',111) as LogDate, 1 as OfferId union all 
select 9  as id,    'Created' as LogStatus, CONVERT(DATETIME, '2020-01-12',111) as LogDate, 3 as OfferId union all 
select 10 as id,    'UnderContract' as LogStatus, CONVERT(DATETIME, '2020-01-13',111) as LogDate, 3 as OfferId union all 
select 11 as id,    'Cancelled' as LogStatus, CONVERT(DATETIME, '2020-01-14',111) as LogDate, 3 as OfferId  
)
SELECT YEARMONTH,SUM(FLAG) FROM (
SELECT YEARMONTH,OFFERID,CASE WHEN ISUNDER2IN1MONTH>1 AND MINLOGUCIN1M <MINLOGCCIN1M THEN 1 WHEN ISUNDER2IN1MONTH<=1 AND MINLOGUCIN1M<MAXLOGCCIN1M THEN 0  ELSE 1 END FLAG
FROM (
SELECT  OFFERID,convert(varchar(7), LogDate, 126) YEARMONTH,
COUNT(CASE WHEN LOGSTATUS='UnderContract' then 1 else null end) ISUNDER2IN1MONTH,
MAX(CASE WHEN LOGSTATUS='UnderContract' THEN LOGDATE END ) MAXLOGUCIN1M,
MIN(CASE WHEN LOGSTATUS='UnderContract' THEN LOGDATE END )MINLOGUCIN1M,
MAX(CASE WHEN LOGSTATUS='Cancelled' THEN LOGDATE END ) MAXLOGCCIN1M,
MIN(CASE WHEN LOGSTATUS='Cancelled' THEN LOGDATE END )MINLOGCCIN1M
FROM MAIN
  GROUP BY OFFERID,convert(varchar(7), LogDate, 126)
 ) A
  )B
  GROUP BY YEARMONTH

Рабочая демонстрация

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...