首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当其中一个变量获得0值时,SQL查询不显示行

当其中一个变量获得0值时,SQL查询不显示行
EN

Database Administration用户
提问于 2019-11-20 16:25:56
回答 1查看 378关注 0票数 0

我有一个设置为返回%的查询,但是当列表值中的一个sender_marks获得0%时,标记不会显示为0,而是消失。

代码语言:javascript
复制
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
EN

回答 1

Database Administration用户

发布于 2019-11-21 12:15:05

您的问题是,您在内部将两个子查询连接在一起,这意味着如果在其中一个子查询中没有用于联接条件的行(在您的示例中是p.sender_mark = b.sender_mark),则不会在另一个子查询中获得该行的结果中的一行。

您可以通过将连接转换为外部连接来绕过这一问题,但是(IMO)更好的选择是使用条件聚合,如下所示:

代码语言:javascript
复制
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忽略这些行。

这样做意味着您现在只查询表一次,而不是两次,这几乎总是更有表现力。

票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/253758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档