Как вернуть пустое поле в строке? - PullRequest
0 голосов
/ 29 марта 2019

Некоторые компоненты самолета должны выполнять плановое техническое обслуживание, чтобы поддерживать его надежность. Но для того, чтобы быть видимым для персонала по планированию технического обслуживания, компонент PN должен находиться в базе данных компонентов воздушного судна. Исходя из этого, я создал код, который возвращает самолет, список его компонентов которого неполон.

Код должен работать следующим образом:

1) Первый столбец = Активные самолеты;

2) Второй столбец = PN компонента, для которого запланировано техническое обслуживание, из среды планирования технического обслуживания;

3) Третий столбец = Количество компонентов, установленных на самолете;

4) четвертый столбец = регистр, который возвращается, если компонент установлен (случай 1) или если он не установлен (случай 0)

SELECT B.AC,
A.PN,
COUNT (DISTINCT (A.AC)) AS "Nº OF CONTROLS",
B.AC_TYPE ||'-'|| B.AC_SERIES AS "TYPE/SERIES",
(CASE WHEN COUNT (DISTINCT (A.AC)) = 1 THEN 1 ELSE 0 END) AS "CHECK"

FROM ODB.PLANNING A
LEFT JOIN ODB.AC_MASTER B
ON A.AC = B.AC

WHERE A.PN IN ('RCF6709')

AND B.AC_TYPE ||'-'|| B.AC_SERIES = 'ATR72-600'

AND B.STATUS = 'ACTIVE'

GROUP BY B.AC,
B.AC_TYPE ||'-'|| B.AC_SERIES,
A.PN

Я извлек отчет об Excel из среды планирования технического обслуживания, и у нас есть 37 активных самолетов, и, учитывая, что на каждом самолете должен быть установлен один компонент pn RCF6709, мой код не работает, потому что он возвращает только 33 самолета. При этом отображается только самолет, на котором установлен компонент pn RCF6709, но должен отображаться и самолет, на котором не установлен компонент pn RCF6709.

См. Изображение по этой ссылке, чтобы лучше понять.

https://drive.google.com/folderview?id=1-1VvWdcKXTW032IEGlX9xBO41FhmRYiV

Ответы [ 2 ]

0 голосов
/ 29 марта 2019

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

Я думаю, это может быть то, что вы хотите:

SELECT B.AC,
  A.PN,
  COUNT (DISTINCT A.AC) AS "Nº OF CONTROLS",
  B.AC_TYPE ||'-'|| B.AC_SERIES AS "TYPE/SERIES",
  CASE WHEN COUNT (DISTINCT A.AC) = 1 THEN 1 ELSE 0 END AS "CHECK"
FROM ODB.AC_MASTER B
LEFT JOIN ODB.PLANNING A
ON A.AC = B.AC
AND A.PN = 'RCF6709'
WHERE B.AC_TYPE ||'-'|| B.AC_SERIES = 'ATR72-600'
AND B.STATUS = 'ACTIVE'
GROUP BY B.AC,
  B.AC_TYPE ||'-'|| B.AC_SERIES,
  A.PN

но это явно не проверено, поскольку у нас нет образцов данных или ожидаемых результатов.

Я не уверен, что вам нужно distinct в счетчиках, как это значение (или, по крайней мере, версия b, которая совпадает из-за условия соединения, если есть совпадение, и счет будет ноль, если нет) входит в группировку.

0 голосов
/ 29 марта 2019

пожалуйста, попробуйте

WHERE (A.PN IN ('RCF6709') or A.PN IS NULL )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...