Oracle group by having

花开花落人是物非 2020-07-10 05:07:13
有一条SQL执行后没有返回预想的结果,请大家帮忙看看

   SELECT NVL(F_PHONE,'-1') F_PHONE FROM T_ACTIVITY GROUP BY F_PHONE  HAVING COUNT(*) >=3 


预想结果:

1. 如果F_PHONE 为null 则显示字符-1;

2. 如果F_PHONE 不为null 则直接显示分组后满足条件的F_PHONE 。


实际结果:

数据库有满足分组条件的数据,出现3次的号码则会显示。数据库没有满足条件的数据,则直接不显示,如图。







...全文
4515 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 securitit 的回复:
这里有个逻辑问题, 比如目前T_ACTIVITY有10条记录: F_PHONE null -- 为表达含义,null表示空值. test null null test test test admin user user 把你的SQL稍稍做下更改,SELECT NVL(F_PHONE,'-1') F_PHONE, COUNT(*) CNT FROM T_ACTIVITY GROUP BY F_PHONE HAVING COUNT(*) >=3,那么统计结果是: F_PHONE CNT -1 3 tes 3 也就是说这个SQL只能在行级别维度做统计,having条件不符合时,统计结果为空是正常的,因为null值或者被重命名为-1的值都是统计项。
确实最后也是修改了SQL达到了了查询的目的,修改方式也差不多。当时就是有点迷惑。让大神们看看
薛定谔之死猫 2020-07-12
  • 打赏
  • 举报
回复
SELECT NVL(F_PHONE,'-1') F_PHONE FROM T_ACTIVITY GROUP BY F_PHONE HAVING COUNT(F_PHONE) NOT BETWEEN 1 AND 2
薛定谔之死猫 2020-07-12
  • 打赏
  • 举报
回复
SELECT NVL(F_PHONE,'-1') F_PHONE FROM T_ACTIVITY GROUP BY F_PHONE HAVING COUNT(F_PHONE) NOT BETWEEN 1 AND 3
亦夜 2020-07-11
  • 打赏
  • 举报
回复

-- Oracle转换语法:
nvl(“字段名”,’转换后的值’);-- //字段名是双引号,转换后的值是单引号

-- 使用用例:
SELECT USERNAME FROM B_USER;
SELECT nvl("USERNAME",'改变后的值') as username FROM B_USER;
胖到没有朋友 2020-07-11
  • 打赏
  • 举报
回复
引用 楼主 花开花落人是物非 的回复:
有一条SQL执行后没有返回预想的结果,请大家帮忙看看
   SELECT NVL(F_PHONE,'-1') F_PHONE FROM T_ACTIVITY GROUP BY F_PHONE  HAVING COUNT(*) >=3 
预想结果: 1. 如果F_PHONE 为null 则显示字符-1; 2. 如果F_PHONE 不为null 则直接显示分组后满足条件的F_PHONE 。 实际结果: 数据库有满足分组条件的数据,出现3次的号码则会显示。数据库没有满足条件的数据,则直接不显示,如图。
你先看一下你们数据库里面那个字段没有值的话是null还是空串,如果是null的话 你把前面的sql作为嵌套sql,然后再group by试试
jingcairensheng 2020-07-11
  • 打赏
  • 举报
回复
SELECT Nvl(F_PHONE, '-1')F_PHONE
FROM T_ACTIVITY
GROUP BY Nvl(F_PHONE, '-1')
HAVING Count(F_PHONE) >= 3
securitit 2020-07-11
  • 打赏
  • 举报
回复
这里有个逻辑问题, 比如目前T_ACTIVITY有10条记录: F_PHONE null -- 为表达含义,null表示空值. test null null test test test admin user user 把你的SQL稍稍做下更改,SELECT NVL(F_PHONE,'-1') F_PHONE, COUNT(*) CNT FROM T_ACTIVITY GROUP BY F_PHONE HAVING COUNT(*) >=3,那么统计结果是: F_PHONE CNT -1 3 tes 3 也就是说这个SQL只能在行级别维度做统计,having条件不符合时,统计结果为空是正常的,因为null值或者被重命名为-1的值都是统计项。

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧