Возвращение максимальной даты и нулевой даты из объединенной таблицы - PullRequest
0 голосов
/ 08 мая 2019

Я пытаюсь получить результаты максимальной или нулевой даты за определенный период времени из объединенной таблицы.Это проблема с объединением или моим предложением?Я в растерянности прямо сейчас.

Я проверил множество вопросов по StackOverflow и не смог достичь желаемого результата, сообщая как нулевые, так и максимальные результаты.

SELECT 
i.item
, i.description
--, i.last_inv
--, i.change_date
, CASE WHEN MAX(case when m.trans_date is null THEN 1 ELSE 0 END) = 0 THEN MAX(m.trans_date) END AS 'last_used'
FROM item_mst i
LEFT JOIN matltran_mst m on m.item = i.item
WHERE i.item like '2%' and m.trans_type <> 'M'   
GROUP BY i.item, i.description
HAVING (MAX(m.trans_date) NOT BETWEEN '10/1/2017' and '5/8/2019' or MAX(m.trans_date) IS NULL) 
ORDER BY 'last_used'

Я ожидаю около 8 результатов с датой last_used и более 1000 (фактическое число TBD), но вместо этого я получаю 8 результатов с датой last_used без каких-либо значений NULL.

Вот пример ожидаемых результатов:

item last_used

21050000202-0 2017-08-31 00: 00: 00.000 2200130425 2017-08-09 00: 00: 00.0002200130494 2017-09-15 00: 00: 00.000 220030010 2017-09-25 00: 00: 00.000 2201050937-2 2017-09-01 00: 00: 00.000 22081001202 2017-08-16 00: 00: 00.000 2209070909 2017-08-15 11: 31: 45.230 221500 2017-08-21 00: 00: 00.000 21010000215 NULL 21050000215 NULL 21050000215-0 NULL 210800 NULL 21330000202 NULL 213600 NULL 22000000210 NULL

Ответы [ 4 ]

0 голосов
/ 08 мая 2019

Если вы выполняете такую ​​функцию, как MAX для столбца, любые строки со значениями NULL в этом столбце будут игнорироваться. Вы могли бы получить то, что хотите, если отделите запрос для строк WITH NULL m.trans_date из запроса для строк НЕ МЕЖДУ определенными датами в запросе UNION:

SELECT 
i.item
, i.description
--, i.last_inv
--, i.change_date
, 1 AS 'last_used'
FROM item_mst i
LEFT JOIN matltran_mst m on m.item = i.item
WHERE m.trans_date IS NULL
GROUP BY i.item, i.description
ORDER BY 'last_used'

UNION

SELECT 
i.item
, i.description
--, i.last_inv
--, i.change_date
, MAX(m.trans_date)AS 'last_used'
FROM item_mst i
LEFT JOIN matltran_mst m on m.item = i.item
WHERE i.item like '2%' and m.trans_type <> 'M'   
GROUP BY i.item, i.description
HAVING (MAX(m.trans_date) NOT BETWEEN '10/1/2017' and '5/8/2019') 
ORDER BY 'last_used'
0 голосов
/ 08 мая 2019

Вы проверяете все даты, являющиеся NULL, а не одну из них. Итак, попробуйте это:

HAVING MAX(m.trans_date) NOT BETWEEN '2017-10-01' AND '2019-05-08' OR
 -- or whatever these dates really are
       COUNT(m.trans_date) < COUNT(*)  -- are any of them NULL?

Вы также можете исправить оставшуюся часть запроса:

SELECT . . .,
       (CASE WHEN COUNT(m.trans_date) = COUNT(*) THEN MAX(m.trans_dte) END) as last_used  -- NULL if any are NULL
FROM item_mst i LEFT JOIN
     matltran_mst m 
     ON m.item = i.item AND and m.trans_type <> 'M' 
WHERE i.item like '2%'   
GROUP BY i.item, i.description
HAVING MAX(m.trans_date) NOT BETWEEN '2017-10-01' AND '2019-05-08' OR
     -- or whatever these dates really are
       COUNT(m.trans_date) < COUNT(*)  -- are any of them NULL?
ORDER BY last_used;
0 голосов
/ 08 мая 2019

Я думаю, что вы можете напрямую использовать игнорирование многих CASE / WHEN-

MAX(m.trans_date) END AS 'last_used'

Это напрямую вернет Максимальные данные (если даты доступны) или NULL (Если даты нет). И, пожалуйста, измените ORDER BY, как показано ниже -

ORDER BY MAX(m.trans_date)
0 голосов
/ 08 мая 2019

Вам необходимо переместить "m.trans_type <> 'M'" из предложения WHERE в предложение ON.

"m.trans_type <> 'M'" заставляет этот оператор вести себя как внутреннее соединение.

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