Как добавить пользовательское поле YoY для вывода? - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь определить прирост в годовом исчислении по месяцам, с 2017 по 2018 год, для количества заказов Компании на свойство .

Я пробовал кастинг и оконные функции, но неполучение правильного результата.

Пример Таблица 1: Заказы

    BookID  Amnt  BookType  InDate  OutDate  PropertyID  Name  Status
    -----------------------------------------------------------------
    789555 $1000  Company  1/1/2018  3/1/2018  22111   Wendy   Active       
    478141 $1250   Owner   1/1/2017  2/1/2017  35825   John  Cancelled 

Существует только два типа книг (например, Компания, Владелец) и два статуса Книги (например, Активно и Отменено).

Пример Таблица 2: Свойства

   Property ID    State    Property Start Date    Property End Date
---------------------------------------------------------------------
   33111         New York       2/3/2017                
   35825         Michigan       7/21/2016

Дата окончания свойства не указывается, если она все еще принадлежит компании.

Пример Таблица 3: Месяцы

   Start of Month          End of Month
-------------------------------------------
    1/1/2018                1/31/2018

Предыдущий разработчик создал эту таблицу, которая содержит строку для каждого месяца с 2015 по 2020 гг.

Я пробовал много разныхитерации моего текущего кода и даже не могут приблизиться.

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

Мне нужно найти рост по сравнению с предыдущим годом по месяцам, с 2017 по 2018 год, для количества заказов Компании на недвижимость. Заинтересованная сторона запросила, чтобы выходные данные имели следующие столбцы:

Month Name  Bookings_Per_Property_2017  Bookings_Per_Property_2018  YoY                           
-----------------------------------------------------------------------

Количество заказов Компании на недвижимость в месяц должно рассчитываться путем подсчета общего количества активных заказов Компании, выполненных за месяц, деленного наОбщее количество объектов, активных в месяце.

1 Ответ

0 голосов
/ 11 октября 2019

Вот решение, которое должно быть близко к тому, что вам нужно. Он работает:

  • LEFT JOIN по трем таблицам;важная часть состоит в том, чтобы правильно проверить перекрытия в диапазонах дат между months(StartOfMonth, EndOfMonth), bookings(InDate, OutDate) и properties(PropertyStartDate, PropertyEndDate): вы можете взглянуть на этот справочный пост для общего обсуждения того, как действовать эффективно

  • агрегирование по месяцам и использование условного COUNT(DISTINCT ...) для подсчета количества объектов и бронирований в каждом месяце и году. Логика неявно опирается на тот факт, что эта агрегатная функция игнорирует значения NULL. Поскольку мы используем LEFT JOIN s, нам также необходимо учитывать возможность того, что знаменатель может иметь значение 0.

Примечания:

  • вы не предоставили ожидаемых результатов, поэтому это нельзя проверить

  • также вы не объяснили, как вычислить столбец YoY, поэтому я оставил его в покое;Я предполагаю, что вы можете легко вычислить его из других столбцов

Запрос:

SELECT
    MONTH(m.StartOfMonth) AS [Month],
    COUNT(DISTINCT CASE WHEN YEAR(StartOfMonth) = 2017 THEN b.BookID END) 
        / NULLIF(COUNT(DISTINCT CASE WHEN YEAR(StartOfMonth) = 2017 THEN p.PropertyID END), 0) 
        AS Bookings_Per_Property_2017,
    COUNT(DISTINCT CASE WHEN YEAR(StartOfMonth) = 2018 THEN b.BookID END) 
        / NULLIF(COUNT(DISTINCT CASE WHEN YEAR(StartOfMonth) = 2018 THEN p.PropertyID END), 0) 
        AS Bookings_Per_Property_2018
FROM months m
LEFT JOIN bookings b
    ON  m.StartOfMonth <= b.OutDate 
    AND m.EndOfMonth   >= b.InDate
    AND b.status = 'Active'
    AND b.BookType = 'Company'
LEFT JOIN properties p
    ON  m.StartOfMonth <= COLAESCE(p.PropertyEndDate, m.StartOfMonth)
    AND m.EndOfMonth   >= p.PropertyStartDate
GROUP BY MONTH(m.StartOfMonth)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...