Заранее извиняюсь за длину вопроса:
Я работаю над запросом для отображения данных, которые будут извлекаться из разных таблиц в зависимости от объекта, запрашивающего данные.
Мы храним множество статистических данных по отдельным линиям продуктов, и каждое предприятие хотело бы иметь возможность просматривать данные на уровне линии; однако некоторые предприятия также организуют свои продукты в группы по отделам, а затем даже группируют отделы по «потоку создания ценности» (просто еще один уровень в иерархии).
Что я хотел бы сделать, так это отображать данные в самой высокой доступной группе (объекты с потоками создания ценности получают список потоков для объекта, объекты, у которых есть только линейки продуктов, просматривают список продуктов и т. д.).
Я использовал функцию COALESCE, чтобы помочь с этим, так как я заинтересован в проверке значений NULL, чтобы определить, какую организационную группу использует учреждение.
К сожалению, необходимые данные находятся в 6 разных таблицах, что требует нескольких объединений. Я добавил дополнительные параметры для каждого соединения, чтобы попытаться убедиться, что соединения корректны.
Запрос правильно работает со средством, которое не использует потоки или отделы (1 в приведенном ниже примере); генерируется список продуктов и их соответствующие баллы.
Запрос не дает желаемых результатов для других уровней. Для предприятия, организованного с помощью потоков создания ценности (2), желаемым результатом является список потоков этого предприятия и их соответствующие оценки. Вместо этого снова создается список продуктовых линеек.
Вот мой запрос:
select * from
(select a.*, rownum rnum from (
SELECT /*STREAM_ID, DEPT_ID ,LINE,*/
COALESCE(VS.ID, DT.ID, SLR.LINE) "ID",
COALESCE(VS.NAME, DT.NAME, SLR.NAME) "NAME",
case when SAFETY_VALUE = 0 then 'GREEN' when SAFETY_VALUE > 0 then 'RED' else 'WHITE' end AS COLOR
FROM XX_SQDC_LINES_REF SLR
LEFT JOIN SQDC_DEPARTMENT_DETAILS DTD on SLR.SITE=DTD.FACILITY_ID AND SLR.LINE=DTD.LINE_ID
LEFT JOIN SQDC_VALUE_STREAM_DETAILS VSD ON DTD.FACILITY_ID= VSD.FACILITY_ID AND DTD.LINE_ID=VSD.LINE_ID
LEFT JOIN SQDC_SAFETY_MAX KPI ON VSD.FACILITY_ID=KPI.FACILITY_ID AND VSD.LINE_ID=KPI.LINE_ID
LEFT JOIN SQDC_DEPARTMENTS DT ON KPI.FACILITY_ID= DT.FACILITY_ID and dtd.dept_id=dt.id
LEFT JOIN SQDC_VALUE_STREAMS VS ON DT.FACILITY_ID= VS.FACILITY_ID AND DT.VS_ID=VS.ID
WHERE (SITE = 2)
ORDER by NAME
)a)
Таблицы (примеры значений; есть также дополнительные столбцы, которые я пропустил, поскольку они не относятся к этому запросу):
ХХ_SQDC_LINES_REF
Line Name Site
1 Table 1
2 Lamp 1
3 Screen 2
4 Forcep 2
5 Brush 2
6 Camera2 2
7 Screen2 2
8 Forcep2 2
9 Brush2 2
10 Camera2 2
SQDC_DEPARTMENT_DETAILS
Dept_ID Line_ID Facility_ID
1 3 2
1 4 2
2 5 2
2 6 2
3 7 2
3 8 2
4 9 2
4 10 2
SQDC_VALUE_STREAM_DETAILS
Stream_ID Line_ID Facility_ID
1 3 2
1 4 2
1 5 2
1 6 2
2 7 2
2 8 2
2 9 2
2 10 2
SQDC_SAFETY_MAX
Facility_ID Line_ID Actual_Date Safety_Value
1 1 31-Jan-16 0
1 2 31-Jan-16 0
2 3 31-Jan-16 0
2 4 24-Jan-16 10
2 5 24-Jan-16 0
2 7 24-Jan-16 0
2 9 24-Jan-16 0
SQDC_DEPARTMENTS
ID Name Facility_ID VS_ID
1 Dept 1 2 1
2 Dept 2 2 1
3 Dept 3 2 2
4 Dept 4 2 2
SQDC_VALUE_STREAMS
ID Name Facility_ID
1 VS 1 2
2 VS 2 2
Заранее спасибо всем, кто может помочь указать мне в правильном направлении.
Отредактировано, чтобы добавить ожидаемые результаты:
Сайт 1 (без трансляции):
ID Name Color RNUM
1 Table GREEN 1
2 Lamp GREEN 2
Сайт 2 (с потоком):
ID Name Color RNUM
1 VS 1 GREEN 1
2 VS 2 WHITE 2
Я знаю, что мне не хватает некоторых дополнительных функций или операторов, чтобы все работало так, как мне бы хотелось, поэтому давайте посмотрим, смогу ли я перефразировать ожидания:
Я хотел бы отобразить идентификатор, имя и цветовой код значения безопасности для самого высокого уровня (потока, отдела или продукта), используемого на объекте, и в последний день была предоставлена информация.
Согласно таблицам VS и Dept, на сайте 1 нет потоков или отделов, поэтому список продуктов должен быть заполнен. С предоставленными данными сайт 1 будет отображать оба продукта по отдельности с ЗЕЛЕНЫМИ значениями, поскольку данные обоих продуктов относятся к 31 января 2016 года, а значения равны 0. Если бы на сайте 1 был другой продукт с данными до этой даты, цвет был бы быть БЕЛЫМ независимо от фактического значения безопасности.
В идеале сайт 2 должен отображать список только двух потоков создания ценности (поскольку это самый высокий уровень).
Последняя дата для Зоны 2 — 31 января 16 года. В линейках продуктов под VS 1 только Line_ID=3 имеет эту дату (остальные строки имеют более ранние даты). Таким образом, среднее значение безопасности будет равно 0 (10 для Line_ID=4 не будет частью среднего значения из-за более ранней даты), и тогда цвет будет ЗЕЛЕНЫМ.
Все значения безопасности для продуктовых линеек в рамках VS 2 были получены до 31 января 2016 г. и, следовательно, не рассчитывались в среднем, поэтому результат белый.
Надеюсь, это поможет прояснить ситуацию.
Запросы одного случая на запрос от @Hogan:
Запрос на уровне потока создания ценности (например, сайт 2):
select *
from
(select a.*, rownum rnum
from
(SELECT stream_id, NAME, case when SUM(SAFETY_VALUE) = 0 then 'GREEN' when SUM(SAFETY_VALUE) > 0 then 'RED' else 'WHITE' end AS COLOR
FROM SQDC_VALUE_STREAMS VLS LEFT JOIN SQDC_VALUE_STREAM_DETAILS VS ON VLS.ID = VS.STREAM_ID LEFT JOIN SQDC_SAFETY_MAX KPI ON VS.LINE_ID=KPI.LINE_ID
WHERE (vs.facility_id = 2
)
group by name, STREAM_id
ORDER by NAME) a
)
Запрос на уровне отдела (в примере такого сайта нет, но он будет работать так же):
select *
from
(select a.*, rownum rnum
from
(SELECT dept_id, NAME, case when SUM(SAFETY_VALUE) = 0 then 'GREEN' when SUM(SAFETY_VALUE) > 0 then 'RED' else 'WHITE' end AS COLOR
FROM SQDC_DEPARTMENTS DPTS LEFT JOIN SQDC_DEPARTMENT_DETAILS DT ON DPTS.ID = DT.Dept_ID LEFT JOIN SQDC_SAFETY_MAX KPI ON DT.LINE_ID=KPI.LINE_ID
WHERE (DT.facility_id = 7986128121911792
)
group by name, DEPT_id
ORDER by NAME) a
)
Запрос уровня продукта (например, сайт 1):
select *
from
(select a.*, rownum rnum
from
(SELECT line, NAME, case when SAFETY_VALUE = 0 then 'GREEN' when SAFETY_VALUE > 0 then 'RED' else 'WHITE' end AS COLOR
FROM XX_SQDC_LINES_REF SLR LEFT JOIN SQDC_SAFETY_MAX KPI ON SLR.LINE=KPI.LINE_ID
WHERE (SITE = 1
)
ORDER by NAME) a
)
Цель состоит в том, чтобы объединить эти три запроса в один и обеспечить отображение только самого высокого организационного уровня (поток, отдел, продукт) для объекта.