Intereting Posts
Как рассчитать среднее значение с условием в sql Я бы хотел, чтобы некоторые советы, почему это не будет вставлять данные в мою таблицу SQL Функция создания ошибки stynax PostgreSQL Обновление AccessDatasource ничего не делает, но не имеет ошибки Есть ли общий способ SQL для получения имен таблиц и создания таблиц? Extbase – получить созданный sql из запроса как отобразить преобразованный массив байтов как изображение в datagrid Как мне работать с кавычками в SQL использование ввода из текстового файла для предложения WHERE Как мы можем создать динамический SQL-запрос для запуска без учета того, передаются ли параметры или нет в формах окон c # Извлечь первую числовую часть поля Поворотная таблица MySQL Строковый, десятичный или плавающий тип данных для поля цены? Количество рабочих дней между двумя датами Это нормально, если у вас есть алфавитно-цифровое поле в качестве PrimaryKey?

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

Это продолжается от запроса, который был решен ранее через stackoverflow ( возврат ближайшей даты на дату в другой таблице ), однако теперь я хочу немного развить его.

У меня есть SQL:

SELECT * FROM (SELECT O_ASSESSMENTS.ASM_SUBJECT_ID as "P Number", O_ASSESSMENTS.ASM_ID as "Assessment ID", O_ASSESSMENTS.ASM_START_DATE as "Assessment Start", O_ASSESSMENTS.ASM_END_DATE as "Assessment End", O_SERVICE_EVENTS.SEV_ID as "Event ID", O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start", O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End", ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely", row_number() over(PARTITION BY O_ASSESSMENTS.ASM_ID ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE - O_SERVICE_EVENTS.SEV_ACTUAL_DATE))as "Row Number" FROM O_ASSESSMENTS JOIN O_SERVICE_EVENTS ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID Where O_SERVICE_EVENTS.SEV_CODE IN ('ICS_E3','CPINVEST') AND O_ASSESSMENTS.ASM_QSA_ID IN ('AA1329','AA521') ) WHERE "Row Number" = 1 

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

К сожалению, команда и работник снова находятся в другой таблице (o_responsibilities) и связаны с o_assessments от asm_id до res_rec_id.

Проблема в том, что я действительно не уверен, как назвать эту таблицу в вышеупомянутом sql – поэтому любой совет будет действительно оценен!

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

 and "Likely" = 0 

он только возвращает оценки с событием, которое не будет выделять какие-либо проблемы (т.е. оценки без соответствующих событий).

Я все время участвую в SQL, но на данный момент есть много вещей, которые кажутся мне действительно недоступными, поэтому любые советы очень ценятся! Я не был уверен, следует ли изменить исходный запрос или начать новый, поэтому я надеюсь, что я не нарушил какие-либо правила непреднамеренно.

Редактировать:

Хорошо, после решения Марка, это то, что я работаю.

 SELECT * FROM (SELECT OAS.ASM_SUBJECT_ID as "P Number", OAS.ASM_ID as "Assessment ID", OAS.ASM_START_DATE as "Assessment Start", OAS.ASM_END_DATE as "Assessment End", OAS.ASM_AUTH_DATETIME as "Authorisation Date", nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') as "Outcome", nvl(olm_bo.get_org_name(ORE.RES_PARTY_OUN_ID),'') as "Team", nvl(olm_bo.get_per_name(ORE.RES_PARTY_ID),'') as "Worker", OSE.SEV_ID as "Event ID", OSE.SEV_ACTUAL_DATE as "Event Start", OSE.SEV_OUTCOME_DATE as "Event End", ROUND(OAS.ASM_START_DATE -OSE.SEV_ACTUAL_DATE,0) as "Likely", row_number() over(PARTITION BY OAS.ASM_ID ORDER BY abs(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE))as "Row Number" FROM O_ASSESSMENTS OAS INNER JOIN O_RESPONSIBILITIES ORE ON OAS.ASM_ID = ORE.RES_REC_ID AND ORE.RES_PARTY_OUN_ID = 'TEAM' LEFT JOIN O_SERVICE_EVENTS OSE ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID AND OSE.SEV_CODE IN ('EVENT') AND ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) >= -7 AND ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) <= 7 Where OAS.ASM_QSA_ID IN ('ACODE') AND nvl(olm_bo.get_ref_desc(OAS.ASM_OUTCOME,'ASM_OUTCOME'),'') <> 'Abandon' ) WHERE "Row Number" = 1 

Пытаться:

 SELECT * FROM (SELECT OAS.ASM_SUBJECT_ID as "P Number", OAS.ASM_ID as "Assessment ID", OAS.ASM_START_DATE as "Assessment Start", OAS.ASM_END_DATE as "Assessment End", ORE.TEAM, ORE.WORKER, OSE.SEV_ID as "Event ID", OSE.SEV_ACTUAL_DATE as "Event Start", OSE.SEV_OUTCOME_DATE as "Event End", ROUND(OAS.ASM_START_DATE -OSE.SEV_ACTUAL_DATE,0) as "Likely", row_number() over(PARTITION BY OAS.ASM_ID ORDER BY abs(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE))as "Row Number" FROM O_ASSESSMENTS OAS LEFT JOIN O_RESPONSIBILITIES ORE ON OAS.ASM_ID = ORE.RES_REC_ID LEFT JOIN O_SERVICE_EVENTS OSE ON OAS.ASM_SUBJECT_ID = OSE.SEV_SUBJECT_ID AND OSE.SEV_CODE IN ('ICS_E3','CPINVEST') AND ROUND(OAS.ASM_START_DATE - OSE.SEV_ACTUAL_DATE,0) = 0 Where OAS.ASM_QSA_ID IN ('AA1329','AA521') ) WHERE "Row Number" = 1 

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

Начало нового – правильный курс действий; редактирование вопроса для «добавления области» не является хорошей практикой. Это относится к «Добавление области», поэтому новый вопрос был правильным.

 SELECT ID, "Assessment ID", "Assessment Start", "Assessment End", "Event ID", "Event Start", "Event End", Likely, Team_name, Worker_name FROM (SELECT O_ASSESSMENTS.ASM_SUBJECT_ID as "ID", O_ASSESSMENTS.ASM_ID as "Assessment ID", O_ASSESSMENTS.ASM_START_DATE as "Assessment Start", O_ASSESSMENTS.ASM_END_DATE as "Assessment End", O_SERVICE_EVENTS.SEV_ID as "Event ID", O_SERVICE_EVENTS.SEV_ACTUAL_DATE as "Event Start", O_SERVICE_EVENTS.SEV_OUTCOME_DATE as "Event End", ROUND(O_ASSESSMENTS.ASM_START_DATE -O_SERVICE_EVENTS.SEV_ACTUAL_DATE,0) as "Likely", row_number() over(PARTITION BY O_ASSESSMENTS.ASM_ID ORDER BY abs(O_ASSESSMENTS.ASM_START_DATE - O_SERVICE_EVENTS.SEV_ACTUAL_DATE)) as "Row Number", RES.TEAM_NAME, RES.WORKER_NAME FROM O_ASSESSMENTS INNER JOIN O_SERVICE_EVENTS ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID INNER JOIN O_Responsibilities res ON O_Assessments.ASM_ID = res.res_rec_ID WHERE O_SERVICE_EVENTS.SEV_CODE IN ('ICS_E3','CPINVEST') AND O_ASSESSMENTS.ASM_QSA_ID IN ('AA1329','AA521') ) InnerTable WHERE "Row Number" = 1 and (Likely = 0 or LIKELY is null) 

Все, что я здесь делал, было

  1. Добавьте критерии Присоединения во внутренний оператор select
  2. Включенные столбцы, которые вы просили, хотя имена не были предоставлены, поэтому я принял TEAM_NAME и WORKER_NAME, в операторах выбора INNER и OUTER
  3. Выбыли И после присоединения до того, как в комментарии к исходному сообщению
  4. В какой-то момент добавляется псевдоним для имени таблицы во внутренних подборах incase.
  5. Добавлено (вероятно, = 0 или, вероятно, значение null) для внешнего, где условие
  6. Переформатированный SQL немного читаем здесь.

на 5 выше, это может быть не совсем правильно, я не совсем понимаю ваш комментарий об оценках, не имеющих дат обслуживания. Если это так, соединение между оценками и услугами ДОЛЖНО быть левым объединением, а не ИННЕР, если вы хотите ВСЕ оценки и сопутствующие услуги, если они существуют. В настоящее время вы получаете только те оценки, которые имеют соответствующие услуги. Если вам нужны все оценки, могут потребоваться другие изменения.

Так…

  FROM O_ASSESSMENTS INNER JOIN O_SERVICE_EVENTS ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 

(только INNER to LEFT был изменен)

  FROM O_ASSESSMENTS LEFT JOIN O_SERVICE_EVENTS ON O_ASSESSMENTS.ASM_SUBJECT_ID = O_SERVICE_EVENTS.SEV_SUBJECT_ID 

и он предполагает, что оценка всегда имеет отчет о обязанностях, если бы там не было ЛЕВОГО объединения.

Наконец, нужно подумать о том, какой результат вы получите для LIKELY, когда SEV_Actual_Date имеет значение NULL. Какая ценность должна иметь?

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

Имейте в виду, что вам нужно указать, where likely = 0 бит во внешнем запросе (с критерием числа строк), а не в виде строки, потому что likely это псевдоним. Если вы хотите выделить оценки без событий, вы должны сделать left join а также добавить условие, что sev_id is null .

Что-то вроде этого должно сделать трюк:

 select * from (select o_assessments.asm_subject_id as "P Number", o_assessments.asm_id as "Assessment ID", o_assessments.asm_start_date as "Assessment Start", o_assessments.asm_end_date as "Assessment End", o_service_events.sev_id as "Event Id", o_service_events.sev_actual_date as "Event Start", o_service_events.sev_outcome_date as "Event End", o_responsibilities.[WHATEVER] as "Team/Worker Stuff", round(o_assessments.asm_start_date - o_service_events.sev_actual_date,0) as "Likely", row_number() over (partition by o_assessments.asm_id order by abs(o_assessments.asm_start_date - o_service_events.sev_actual_date)) as rn from o_assessments left join o_service_events on o_service_events.sev_subject_id = o_assessments.asm_subject_id left join o_responsibilities on o_responsibilities.res_rec_id = o_assessments.asm_id where o_service_events.sev_code in ('ICS_E3','CPINVEST') and o_assessments.asm_qsa_id in ('AA1329','AA521')) where rn = 1 and (likely = 0 or sev_id is null);