我正在尝试从联接表中获得特定时间段内最大日期或空日期的结果。连接或我的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日期。
以下是预期结果的示例:
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空
答案 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'