Я застрял в представлении SQL Server, которое пытаюсь создать. Представление возвращает список ресурсов, которые назначены проекту, а также некоторые другие детали, такие как информация о контракте.
У меня проблемы с таблицей resource_contracts, потому что я застрял, имея дело с тем, что по сути является полем свободного текста.
SELECT DISTINCT
CONCAT(RTRIM(res.first_name),' ', RTRIM(res.surname)) AS fullname ,
res.main_res_id ,
res.resource_id ,
res.resource_typ ,
res.status ,
rel.rel_value ,
asn.booking_project AS project ,
asn.booking_project_descr AS project_descr ,
asn.assignment_position AS position ,
asn.date_from AS commencement_date ,
DATEADD(DAY,1,asn.date_to) AS end_date ,
con.comment_fx
FROM resourcees res
INNER JOIN resource_relations rel
ON
res.main_res_id = rel.resource_id
AND rel.date_to >= CAST(CURRENT_TIMESTAMP AS DATE)
AND res.client = rel.client
LEFT OUTER JOIN resource_relations cc
ON
res.client = cc.client
AND res.resource_id = cc.resource_id
AND cc.rel_attr_id = 'C1'
AND res.date_to BETWEEN cc.date_from AND cc.date_to
AND cc.status = 'N'
INNER JOIN relation_values ar2
ON
cc.rel_value = ar2.dim_value
AND ar2.client = res.client
INNER JOIN assignments asn
ON
res.main_res_id = asn.resource_id
LEFT OUTER JOIN resource_contracts con
ON
con.dim_value = res.main_res_id
AND res.client = con.client
AND con.comment_fx LIKE '%CONAU%'
AND con.date_to_fx >= asn.date_to
WHERE
asn.booking_project = '123456'
ORDER BY
fullname
Полагаю, вышесказанное выглядит довольно большим. Это последнее присоединение, вызывающее проблему для справки.
Таблица resource_contracts связывается с тремя столбцами. Я ненавижу эту настройку, но, к сожалению, она находится вне моего контроля.
- date_from_fx = DATETIME
- date_to_fx = DATETIME
- comment_fx = VCHAR 255
Он используется для записи даты контракта от и до даты, а также в виде произвольного текстового поля, которое может содержать что угодно. Примеры значений могут быть «CONAU SPP» или «CONSG ABC» и т. Д.
Однако я застрял в поле comment_fx выше.
Я специально хочу увидеть контракты, содержащие CONAU, или вернуть значение NULL, если у них нет значения, которое соответствует дате, или строки вообще нет. К сожалению, эта логика смешивается с любым другим контрактом, таким как "CONSG ABC".
Независимо от того, к какому соединению я применяю, я либо вижу все ресурсы с требуемым контрактом, либо дублирую строки с нулевыми значениями и набором неприменимых контрактов. Я предполагаю, что упускаю что-то простое
В конечном итоге мне нужно составить список ресурсов, которые назначены проекту, но не имеют требуемого контракта (CONAU), этот список запустит другой процесс, который я уже разобрал.
Обновлен:
Позвольте мне показать вам данные, которые возвращаются, если мы удалили таблицу resource_contracts, что вызвало мои проблемы:
Результат данных
Извините, я не смог отформатировать таблицу во что-то, похожее на таблицу, чтобы вставить сюда.
Вот данные из таблицы контрактов:
таблица договоров
Есть несколько вещей, которые я хочу здесь сделать, но я упросту это до одного.
Я пытаюсь отправить параметр в запрос, например, «CONAU». Таким образом, он вернет все ресурсы, которые НЕ имеют допустимой строки, содержащей строку CONAU.
Проблема в том, что они могут иметь другие строки, такие как CONSG, или вообще не иметь строк.
Во время моих попыток я часто получал неправильные строки для отображения, или при использовании ISNULL в части SELECT я получал нулевые строки и дублированные данные.
Условия могут быть изменены, но я пытаюсь научиться этому сам.
SQL скрипка тоже: http://sqlfiddle.com/#!18/7558f/2