Как узнать, есть ли совпадение за определенный промежуток времени между двумя разными полями даты SQL? - PullRequest
0 голосов
/ 09 января 2020

В моей таблице фактов есть столбец, который определяет, является ли Поставщик старым или новым, на основе следующего описания случая:

CASE
             WHEN (SUBSTRING([Reg date], 1, 6) = SUBSTRING([Invoice date], 1, 6) 
             THEN ('New supplier')
             ELSE('Old supplier')
END as [Old/New supplier]

Так, например, если Поставщик был зарегистрирован 201910 и дата Счета Если в 201910 году Поставщик будет считаться «Новым поставщиком» в этом месяце. Теперь я хочу подсчитать количество старых / новых поставщиков для каждого месяца, выполнив четкий подсчет числа поставщиков, что не является проблемой. Последний шаг - это то, где это становится сложным, теперь я хочу подсчитать количество новых / старых поставщиков за 12-месячный период (если было совпадение по дате выставления счета и дате регистрации за любой из отстающих 12 месяцев). Поэтому я создаю следующее выражение mdx:

aggregate(parallelperiod([D Time].[Year-Month-Day].[Year],1,[D Time].[Year-Month-Day].currentmember).lead(1) : [D Time].[Year-Month-Day].currentmember ,[Measures].[Supplier No Distinct Count])

Проблема, с которой я сталкиваюсь, заключается в том, что он будет считать «Поставщик не 1234» дважды, поскольку он был как новым, так и старым в течение этого периода времени. То, что я sh, заключается в том, что, если он найдет одно совпадение, он будет считаться «новым» поставщиком на этот 12-месячный период.

enter image description here

Вот как выглядит результат в итоге, но я хочу, чтобы он был нулевым для «Старого», так как дата Reg и дата Invoice совпадали один раз в течение этого 12-месячный период, который следует считать новым за весь 12-й прокатный месяц 201910

enter image description here

Любая помощь, возможные подходы или идеи высоко ценятся.

С уважением, Рубрикс

Ответы [ 2 ]

1 голос
/ 09 января 2020

Агрегируйте сначала на уровне поставщика, а затем на уровне типа:

select type, count(*)
from (select supplierid,
             (case when min(substring(regdate, 1, 6)) = min(substring(invoicedate, 1, 6))
                   then 'new' else 'old'
              end) as type
      from t
      group by supplierid
     ) s
group by type;

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

1 голос
/ 09 января 2020
SELECT COUNT(*) OVER () AS TotalCount
FROM Facts
WHERE Regdate BETWEEN(olddate, newdate) OR InvoiceDate BETWEEN(olddate, newdate) 
GROUP BY
 Supplier

Приведенный выше запрос вернет всех поставщиков в течение этого периода времени, а затем сгруппирует их. Таким образом, COUNT (*) будет включать только уникальных подписчиков.

Возможно, вы захотите изменить предложение WHERE, потому что я не совсем понял, как вы получаете 12-месячный период. Как правило, если в предложении where возвращаются поставщики в течение этого периода времени (они не обязательно должны быть уникальными), тогда остальное будет обрабатывать group by и count.

...