MS Access SQL Query для представления ежедневных данных за весь год, даже если в определенный день не было продаж - PullRequest
0 голосов
/ 08 февраля 2019

Меня попросили составить таблицу данных / экспортируемый вывод, чтобы показать превосходство, которое показывает общий ЕЖЕДНЕВНЫЙ доход от бронирования событий.

Если вы представляете Даты в верхней части в виде заголовков столбцов, с «Подтипами событий» (IE Wedding, Meeting, Seminar и т. Д.) В виде строк, где финансовая стоимость дохода от каждого подтипа событий суммируется и отображается в видесоответствующий столбец «даты начала события».

Я уже закодировал отчет с перекрестными таблицами, в котором это суммировано по месяцам.Код для этого отчета показан ниже и работает нормально, но мой специалист по финансам хочет видеть ежедневные цифры за каждый день года, включая «0» за каждый день, когда в базе данных фактически нет данных.Я не могу:

  • Создать код для отображения результатов по дням (я использую код, вставленный ниже в качестве отправной точки)
  • Получить таблицу дат, чтобы присоединиться, чтобы я мог показатьвсе даты, даже те, где нет событий.

В моей базе данных есть следующие таблицы:

Dates (ID, Dates = DateTime values from 1/1/2017 - 31/12/2117)

Enquiries (ID, [Customer ID], [Event Name],[Main Status],[Date Event Start],[Event Sub Category])

Financials (ID, [Enquiry ID], [Estimated Income], [Actual Income])

Customers (ID, [CustName] etc)

Запрос Sql:

SELECT enquiries.[event name], 
       enquiries.[main status], 
       enquiries.[date event start], 
       enquiries.[event sub category], 
       financials.[actualincome], 
       financials.[estimatedincome], 
       enquiries.id, 
       Year([date event start])            AS [Year], 
       Month([date event start])           AS [Month], 
       Datepart("q", [date event start])   AS Quarter, 
       Format([date event start], "mmmm")  AS [Month Name], 
       ( Month([date event start]) MOD 3 ) AS MonthOfQuarter, 
       Switch(enquiries.[main status] = 'PIPELINE ENQUIRY' 
               OR enquiries.[main status] = 'Booking Form Sent', 
       financials.[estimatedincome])       AS EstimatedPipelineIncome, 
       Switch(enquiries.[main status] = 'CONFIRMED BOOKING' 
               OR enquiries.[main status] = 'Ts & Cs and Quote Sent' 
               OR enquiries.[main status] = 'Signed Ts & Cs Received', 
       financials.[actualincome])          AS ConfirmedIncome, 
       Switch(enquiries.[main status] = 'EVENT COMPLETED', 
       financials.[actualincome]) 
                                           AS CompletedIncome 
FROM   customers 
       INNER JOIN (enquiries 
                   INNER JOIN financials 
                           ON enquiries.id = financials.[enquiry id]) 
               ON customers.id = enquiries.[customer id] 
WHERE  (( ( enquiries.[main status] ) = "pipeline enquiry" 
           OR ( enquiries.[main status] ) = "booking form sent" 
           OR ( enquiries.[main status] ) = "confirmed booking" 
           OR ( enquiries.[main status] ) = "ts & cs and quote sent" 
           OR ( enquiries.[main status] ) = "signed ts & cs received" 
           OR ( enquiries.[main status] ) = "event completed" )) 
ORDER  BY enquiries.[date event start];  

У меня естьпросматривал подобные вопросы и ответы на эту проблему в течение 3 недель на SO - но я не могу заставить их работать с моим собственным экземпляром, так как у меня проблемы с SQL.

Кто-нибудь может помочь предоставитьКод SQL, который поможет мне соответствующим образом добавить таблицу Dates в этот SQL и изменить запрос для решения этой проблемы?

Это мой первый пост, поэтому, пожалуйста, укажите, где мне нужно предоставить больше информации или задать вопросы вдругой способ помочь!

ОБНОВЛЕНИЕ :

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

SELECT Dates.Dates, Enquiries.[Event Sub Category], Financials.ActualIncome, Financials.[Total Booking Value Incl VAT]
FROM Dates LEFT JOIN Enquiries ON Dates.[Dates] = Enquiries.[Date Event Start];

Поэтому мне действительно нужно, чтобы ниже работало, но я не могу получить его:

SELECT Dates.Dates, Enquiries.[Event Sub Category], Financials.ActualIncome, Financials.[Total Booking Value Incl VAT]
FROM (Enquiries INNER JOIN Financials ON Enquiries.[ID] = Financials.[Enquiry ID]) LEFT JOIN Dates ON Dates.[Dates] = Enquiries.[Date Event Start];

Ответы [ 2 ]

0 голосов
/ 09 февраля 2019

Спасибо за помощь.Ответ был:

SELECT Dates.Dates, Enquiries.[Event Sub Category], Financials.ActualIncome, Financials.EstimatedIncome

FROM Dates LEFT JOIN (SELECT
                     Enquiries.[Date Event Start],
                     Enquiries.[Event Sub Category],
                     Financials.ActualIncome,
                     Financials.EstimatedIncome
                   FROM
                   Enquiries INNER JOIN Financials

                   ON Enquiries.ID = Financials.[Enquiry ID] )  AS sub ON Dates.Dates= sub.[Date Event Start];
0 голосов
/ 08 февраля 2019

Как я уже упоминал в комментарии к вопросу, у вас есть таблица [Dates], в которой используется left join (ранее я ошибался), что позволяет вам получать все даты из таблицы [Даты] и соответствующие данные из других таблиц.Пожалуйста, обратитесь по ссылке, указанной в комментарии.

Совет: используйте псевдонимы таблиц .Это делает код SQL более читабельным.

Посмотрите на этот запрос:

SELECT D.[EventDate], E.[Event Name], E.[MAIN STATUS], 
    E.[Event Sub Category], F.[ActualIncome], F.[EstimatedIncome],
    E.ID, Year(D.[EventDate]) AS [Year], Month(D.[EventDate]) AS [Month],
    DatePart("q",D.[EventDate]) AS Quarter, Format(D.[EventDate],"mmmm") AS [Month Name],
    (Month(D.[EventDate]) Mod 3) AS MonthOfQuarter,
    Switch(E.[MAIN STATUS]='PIPELINE ENQUIRY' Or E.[MAIN STATUS]='Booking Form Sent', F.[EstimatedIncome]) AS EstimatedPipelineIncome,
    Switch(E.[MAIN STATUS]='CONFIRMED BOOKING' Or E.[MAIN STATUS]='Ts & Cs and Quote Sent' Or E.[MAIN STATUS]='Signed Ts & Cs Received',F.[ActualIncome]) AS ConfirmedIncome,
    Switch(E.[MAIN STATUS]='EVENT COMPLETED',F.[ActualIncome]) AS CompletedIncome
FROM [Dates] D LEFT JOIN (
        Customers C INNER JOIN (
            Enquiries E INNER JOIN Financials F ON E.ID = F.[Enquiry ID])
                ON C.ID = E.[Customer ID])
            ON D.EventDate = E.[Date Event Start]
WHERE (((E.[MAIN STATUS])="PIPELINE ENQUIRY" Or 
    (E.[MAIN STATUS])="Booking Form Sent" Or 
    (E.[MAIN STATUS])="CONFIRMED BOOKING" Or 
    (E.[MAIN STATUS])="Ts & Cs and Quote Sent" 
    Or (E.[MAIN STATUS])="Signed Ts & Cs Received" 
    Or (E.[MAIN STATUS])="EVENT COMPLETED"))
ORDER BY E.[Date Event Start];

Обратите внимание, что у меня нет доступа к вашим данным, поэтому приведенный выше SQL-код может содержать ошибку(с).

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