Здесь я проделал следующие действия.
- Получите количество предложений «Недоговора» в том же месяце
- Максимальные и минимальные значения «Недоговора» и «Отменено» одинаковы предложение.
- Поместите их в предложение
CASE WHEN
и дайте им числа в качестве условий и назовите этот новый столбец как FLAG
. - Затем просуммируйте эти значения.
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
Рабочая демонстрация