从联接表返回最大日期和空日期

时间:2019-05-07 21:21:47

标签: sql sql-server ssms

我正在尝试从联接表中获得特定时间段内最大日期或空日期的结果。连接或我的hading子句有问题吗?我现在很茫然。

我已经检查了关于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个结果,并且超过1000个(实际数字TBD),但是我得到的最后一个日期却得到8个结果,而没有任何NULL日期。

以下是预期结果的示例:

项目last_used

21050000202-0 2017-08-31 00:00:00.000 2200130425 2017-08-09 00:00:00.000 2200130494 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空 21050000215空 21050000215-0空 210800空 21330000202空 213600空 22000000210空

4 个答案:

答案 0 :(得分:0)

您需要将“ m.trans_type <>'M'”从WHERE子句移到ON子句。

“ m.trans_type <>'M'”导致该语句的行为类似于内部联接。

答案 1 :(得分:0)

您正在检查所有日期为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;

答案 2 :(得分:0)

我认为您可以直接使用忽略很多CASE / WHEN-

MAX(m.trans_date) END AS 'last_used'

这将直接返回Maximum data(如果有日期)或NULL(如果没有日期)。并请按以下方式更改ORDER BY-

ORDER BY MAX(m.trans_date)

答案 3 :(得分:0)

如果对某列执行MAX之类的功能,则该列中具有NULL值的任何行都将被忽略。如果您从查询UNION查询中某些日期之间不存在的行中分离出m.trans_date为NULL的行的查询,您可能会得到想要的结果:

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'