【问题标题】:Want to return 0 in case of no rows想要在没有行的情况下返回 0
【发布时间】:2019-07-12 10:06:26
【问题描述】:
select 
    IMEI_ID, dev_status, nvl(count(1), 0) AS Count
from 
    device
where 
    IMEI_ID IN (284700, 250779, 320700, 339622, 323400)
    and Dev_status = 'ACTIVE'
group by 
    IMEI_ID,dev_status;

对于少数IMEI_ID,不返回任何行。我希望这些缺失行的计数为零 (0)。

谢谢

【问题讨论】:

  • 哪种sql类型?
  • 不确定你的脚本里nvl是什么,你可以试试coalesce(count(1),0)
  • 请提及您使用的sql方言或数据库产品
  • 您需要一个即时构建的IMEI_IDs 表,这是特定于sql 产品的(nvl - 我猜是Oracle?)。然后离开加入您的查询。

标签: sql


【解决方案1】:

对于甲骨文

with i(ime_id) as
( 
    SELECT 284700 FROM DUAL UNION ALL
    SELECT 250779 FROM DUAL UNION ALL
    SELECT 320700 FROM DUAL UNION ALL
    SELECT 339622 FROM DUAL UNION ALL
    SELECT 323400 FROM DUAL 
)
select i.IMEI_ID, d.dev_status, nvl(count(d.ime_id),0) AS Count
from i
left join device d on i.ime_id = d.IMEI_ID
   and d.Dev_status='ACTIVE'
group by i.IMEI_ID, d.dev_status;

【讨论】:

  • 现代 MySQL 和 MariaDB 版本也支持 CTE 和 DUAL 虚拟表的无表选择
  • @RaymondNijland,OP 中的 'nvl` 指向 Oracle,所以我没有提及其他 dbms。
  • true nvl() 仅适用于 Oracle,但也可以替换为 coalesce() 以支持其他 dbmses。..
【解决方案2】:

在设备上使用请求的IMEI_IDLEFT OUTER JOIN 创建一个(临时)表:

SELECT          imei_ids.imei_id,
                device.dev_status,
                COUNT(device.dev_status)
FROM            imei_ids
LEFT OUTER JOIN device
             ON imei_ids.imei_id = device.imei_id
            AND device.dev_status = 'ACTIVE'
GROUP BY        imei_ids.imei_id,
                device.dev_status;

【讨论】:

    猜你喜欢
    • 2019-04-13
    • 2021-06-27
    • 2021-08-14
    • 2020-07-08
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多