Создание расписания с помощью SQL (рассчитанное время начала для слотов) и фильтрация по лицам, чтобы показать им свои слоты - PullRequest
0 голосов
/ 16 мая 2019

Я работаю в iMIS CMS (iMIS 200) и пытаюсь создать IQA (запрос iMIS, используя SQL), который даст мне расписание слотов, назначаемых людям на день (у меня это работает);но потом я хочу иметь возможность отфильтровать это расписание в профиле человека, чтобы он просто видел слоты, которым он назначен.

(Это для прослушивания в оркестре. Поэтому люди подают заявку на инструмент, а затемэти приложения назначаются на слоты для прослушивания, из которых есть несколько слотов в день)

Поскольку время начала / окончания слотов рассчитывается с использованием SUM OVER, когда я фильтрую этот запрос по идентификатору человека, я теряюправильное время начала / окончания для слотов (так как другие слоты отсутствуют в данных для него в сумме, я думаю!)

Структура таблицы:

tblContacts
===========
ContactID   ContactName
---------------------------
1           Steve Jones
2           Clare Philips
3           Bob Smith
4           Helen Winters
5           Graham North
6           Sarah Stuart
tblApplications
=============== 
AppID   FKContactID     Instrument
-----------------------------------
1       1               Violin
2       1               Viola
3       2               Cello
4       3               Cello
5       4               Trumpet
6       5               Clarinet
7       5               Horn
8       6               Trumpet
tblAuditionDays
=============== 
AudDayID  AudDayDate   AudDayVenue    AudDayStart
-------------------------------------------------
1         16-Sep-19    London         10:00
2         17-Sep-19    Manchester     10:00
3         18-Sep-19    Birmingham     13:30
4         19-Sep-19    Leeds          10:00
5         19-Sep-19    Glasgow        11:30
tblAuditionSlots
================
SlotID  FKAudDayID   SlotOrder  SlotType   SlotDuration   FKAppID
-----------------------------------------------------------------
1       1            1          Audition   20             3
2       1            2          Audition   20             4
3       1            3          Chat       10             3
4       1            5          Chat       10             4
5       1            4          Audition   20             
6       2            1          Audition   20             1
7       2            2          Audition   20             6
8       2            4          Chat       10             6
9       2            3          Chat       10             1
10      2            5          Audition   20             
11      3            2          Chat       10             8
12      3            1          Audition   20             2
13      3            4          Chat       5              2
14      3            3          Audition   20             8
15      5            1          Audition   30             5
16      5            2          Audition   30             7
17      5            3          Chat       15             7
18      5            4          Chat       15             5

Текущий SQL для перечисления всех слотов каждый день (в порядке даты / слота, с правильно рассчитанными временными интервалами слотов):

SELECT
    [tblAuditionSlots].[SlotOrder] as [Order],
    CASE
        WHEN
            SUM([tblAuditionSlots].[SlotDuration]) OVER (PARTITION BY [tblAuditionDays].[FKAudDayID] ORDER BY [tblAuditionSlots].[SlotOrder] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) is null 
        THEN
            CONVERT(VARCHAR(5), [tblAuditionDays].[AudDayStart], 108)
        ELSE
            CONVERT(VARCHAR(5), Dateadd(minute, SUM([tblAuditionSlots].[SlotDuration]) OVER (PARTITION BY [tblAuditionDays].[FKAudDayID] ORDER BY [tblAuditionSlots].[SlotOrder] ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), [tblAuditionDays].[AudDayStart]), 108)
        END
    + ' - ' + 
    CASE 
        WHEN
            SUM([tblAuditionSlots].[SlotDuration]) OVER (PARTITION BY [tblAuditionDays].[FKAudDayID] ORDER BY [tblAuditionSlots].[SlotOrder] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) is null
        THEN
            CONVERT(VARCHAR(5), [tblAuditionDays].[AudDayStart], 108)
        ELSE
            CONVERT(VARCHAR(5), Dateadd(minute, SUM([tblAuditionSlots].[SlotDuration]) OVER (PARTITION BY [tblAuditionDays].[FKAudDayID] ORDER BY [tblAuditionSlots].[SlotOrder] ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW), [tblAuditionDays].[AudDayStart]), 108)
        END AS [Slot],
    [tblAuditionSlots].[SlotType] AS [Type],
    [tblContacts].[ContactName] as [Name],
FROM
    tblAuditionSlots
    LEFT JOIN tblAuditionDays ON tblAuditionSlots.FKAudDayID = tblAuditionDays.AudDayID
    LEFT JOIN tblApplications ON tblAuditionSlots.FKAppID = tblApplications.AppID
    LEFT JOIN tblContacts ON tblApplications.FKContactID = tblContacts.ContactID
GROUP BY
    [tblAuditionSlots].[SlotOrder],
    [tblAuditionSlots].[SlotType],
    [tblAuditionSlots].[SlotDuration],
    [tblAuditionDays].[AudDayStart],
    [tblContacts].[ContactName],
    [tblContacts].[ContactID],
    [tblAuditionDays].[AudDayID],
    [tblAuditionDays].[AudDayDate]
ORDER BY
    [tblAuditionDays].[DayDate],
    [tblAuditionSlots].[Order]  

iMIS, используемая нами CMS, ограниченачто вы можете создать в IQA (запрос).Вы можете вставить (немного) SQL как столбец и дать ему псевдоним;Вы можете добавить (не рассчитанные) поля к заказу с помощью;Вы не можете реально контролировать Группу по (какие бы поля не были добавлены, они включены в Группу по).

В конечном счете, я бы хотел отфильтровать это по идентификатору контакта, чтобы я мог видеть все ихслоты для прослушивания, но с правильно рассчитанным временем.

Из примеров данных, например:

STEVE JONES AUDITIONS
=====================
Date        Slot             Venue       Type         Instrument
----------------------------------------------------------------
17-Sep-19   10:00 - 10:20    Manchester  Audition     Violin
17-Sep-19   10:40 - 10:50    Manchester  Chat         Violin
18-Sep-19   13:30 - 13:50    Birmingham  Audition     Viola
18-Sep-19   14:30 - 14:35    Birmingham  Chat         Viola

HELEN WINTERS AUDITIONS
=======================
Date        Slot             Venue       Type         Instrument
----------------------------------------------------------------
19-Sep-19   11:30 - 12:00    Glasgow     Audition     Trumpet
19-Sep-19   12:45 - 13:00    Glasgow     Chat         Trumpet

Надеюсь, что все это имеет смысл, и я предоставил достаточно информации.

(В этой версии iMIS [200] вы не можете выполнять подзапросы, в случае, если они появятся ...)

Большое спасибо заранее за любую помощь / советы / советы, которые вы можете предложить!

Крис

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