我有一个设置为返回%的查询,但是当列表值中的一个sender_marks获得0%时,标记不会显示为0,而是消失。
SELECT p.SENDER_MARK,ROUND (Removed/TotalTrains*100,2) TrainRemovals
FROM
(SELECT COUNT(DISTINCT TRAIN_ID) AS Removed,SENDER_MARK
FROM BULLETIN.DISPATCH_TRAIN
WHERE SENDER_MARK in ( 'BNSF','NS','UP','METR','BRC','CPRS','CSXT')
AND REMOVED_FROM_DISPATCH_IND = 'Y'
AND MODIFIED_TS >= SYSDATE-7 group by SENDER_MARK ) p,
(SELECT COUNT(DISTINCT TRAIN_ID) AS TotalTrains,SENDER_MARK
FROM BULLETIN.DISPATCH_TRAIN
WHERE SENDER_MARK in ( 'BNSF','NS','UP','METR','BRC','CPRS','CSXT')
AND MODIFIED_TS >= SYSDATE-7 group by SENDER_MARK )b where p.SENDER_MARK=b.SENDER_MARK发布于 2019-11-21 12:15:05
您的问题是,您在内部将两个子查询连接在一起,这意味着如果在其中一个子查询中没有用于联接条件的行(在您的示例中是p.sender_mark = b.sender_mark),则不会在另一个子查询中获得该行的结果中的一行。
您可以通过将连接转换为外部连接来绕过这一问题,但是(IMO)更好的选择是使用条件聚合,如下所示:
SELECT sender_mark,
ROUND(removed * 100 / total_trains, 2) trainremovals
FROM (SELECT sender_mark,
COUNT(DISTINCT CASE WHEN removed_from_dispatch_ind = 'Y' THEN train_id END) AS removed,
COUNT(DISTINCT train_id) AS totaltrains
FROM bulletin.dispatch_train
WHERE sender_mark IN ('BNSF', 'NS', 'UP', 'METR', 'BRC', 'CPRS', 'CSXT')
AND modified_ts >= SYSDATE - 7
GROUP BY sender_mark);聚合函数(包括COUNT,除了在执行COUNT(*)时除外)几乎都从计算中排除了空值。因此,如果不满足条件,则输出空值,就可以让COUNT忽略这些行。
这样做意味着您现在只查询表一次,而不是两次,这几乎总是更有表现力。
https://dba.stackexchange.com/questions/253758
复制相似问题