Oracle查询补全

在写一个查询语句,需要查询给定姓名的十二星座人数,但是有的人十二星座并不是全都有,所以返回值可能存在不足十二星座的情况,下面这个查询把不存在的加上了, 并且赋值为0.
正常的查询显示结果为:
1 摩羯座 105
2 射手座 118
3 金牛座 89
4 牡羊座 104
5 天蝎座 136
6 水瓶座 89
7 处女座 124
8 双鱼座 92
9 双子座 107
10 巨蟹座 104
11 未知 2
12 狮子座 108
13 天秤座 129
多几个未知的
或者
1 摩羯座 5
2 射手座 5
3 天蝎座 8
4 牡羊座 2
5 水瓶座 3
6 处女座 9
7 双鱼座 5
8 双子座 2
9 巨蟹座 2
10 狮子座 7
11 天秤座 12
少几个星座
如下查询可以完美解决:

select dt.xz, dt.rs as num from (
select dd.xz xz, nvl(tt.rs ,0)+ dd.rs rs from (
select get_xingzuo( replace(substr (t.birthday, 6, 5 ),'-', '')) as xz,count( 1) as rs
from psn_base_info t where t.name='张三' and t.logoff_flag= 0 
group by get_xingzuo(replace (substr( t.birthday, 6 , 5), '-','' ))) tt
right join (
select '摩羯座' xz, 0 rs from dual
union all
select '水瓶座' xz, 0 rs from dual
union all
select '双鱼座' xz, 0 rs from dual
union all
select '牡羊座' xz, 0 rs from dual
union all
select '金牛座' xz, 0 rs from dual
union all
select '双子座' xz, 0 rs from dual
union all
select '巨蟹座' xz, 0 rs from dual
union all
select '狮子座' xz, 0 rs from dual
union all
select '处女座' xz, 0 rs from dual
union all
select '天秤座' xz, 0 rs from dual
union all
select '天蝎座' xz, 0 rs from dual
union all
select '射手座' xz, 0 rs from dual
) dd on tt.xz=dd.xz
) dt

如上的代码查询结果为:
1 摩羯座 105
2 射手座 118
3 金牛座 89
4 牡羊座 104
5 天蝎座 136
6 水瓶座 89
7 处女座 124
8 双鱼座 92
9 双子座 107
10 巨蟹座 104
11 狮子座 108
12 天秤座 129

和:
1 摩羯座 5
2 射手座 5
3 天蝎座 8
4 牡羊座 2
5 水瓶座 3
6 处女座 9
7 双鱼座 5
8 双子座 2
9 巨蟹座 2
10 狮子座 7
11 天秤座 12
12 金牛座 0

完美解决~
另,附上获取星座的函数:

create or replace function get_xingzuo(yr in varchar2) RETURN VARCHAR2 is xingzuo VARCHAR2(20);
dnum number(4);
dt date;
begin
  dt := to_date(yr,'MMDD');
  dnum:=to_number(to_char(dt,'MMdd'));
select case
when dnum>=1222 or dnum<=119 then '摩羯座'
when dnum>=120 and dnum<=218 then '水瓶座'
when dnum>=219 and dnum<=320 then '双鱼座'
when dnum>=321 and dnum<=420 then '牡羊座'
when dnum>=421 and dnum<=520 then '金牛座'
when dnum>=521 and dnum<=621 then '双子座'
when dnum>=622 and dnum<=722 then '巨蟹座'
when dnum>=723 and dnum<=822 then '狮子座'
when dnum>=823 and dnum<=922 then '处女座'
when dnum>=923 and dnum<=1022 then '天秤座'
when dnum>=1023 and dnum<=1121 then '天蝎座'
when dnum>=1122 and dnum<=1221 then '射手座'
end into xingzuo from dual;
return xingzuo;
EXCEPTION
   WHEN OTHERS THEN
      RETURN '未知';
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值