我现在经过一系列查询得到以下结果:name 风险等级 数量
---------------------
a 高 2
a 中 5
b 高 2
c 低 8但是我想得到的是这样的:name 风险等级 数量
---------------------
a 高 2
a 中 5
a 低 0
b 高 2
b 中 0
b 低 0
c 低 8
c 高 0
c 中 0也就是说我想让各个风险等级的数量是0的也显示出来,请问我如何写这个sql?想了半天没有结果,期望大家能给我点思路,谢谢!
---------------------
a 高 2
a 中 5
b 高 2
c 低 8但是我想得到的是这样的:name 风险等级 数量
---------------------
a 高 2
a 中 5
a 低 0
b 高 2
b 中 0
b 低 0
c 低 8
c 高 0
c 中 0也就是说我想让各个风险等级的数量是0的也显示出来,请问我如何写这个sql?想了半天没有结果,期望大家能给我点思路,谢谢!
解决方案 »
- listagg 字符串连接的结果过长
- windows下面安装的oracle 11g 用自带的sql plus 操作的,执行了一下shutdown,在连接就连不上了,请问应该如何操作?
- Oracle找回数据
- 重新安装Oracle时,应该将Oracle中哪些文件备份出来
- and 跟 or 混在一起的时候,执行顺序是?
- oracle 创建的函数的返回类型
- 列名是个关键字 select ,选择语句怎样写?
- 装上oracle后机器特别慢,是自动运行了db服务器吗,怎么让它不自动运行.
- 在模糊查询中,如果字段是字符型的,用select * from 表1 where nvl(zd1,' ') like '%%'显示的是全部记录,包括zd1的值为空的,但如果zd1是da
- oracle有关问题
- 求sql语句,多条记录怎么累加同一字段的值
- Asp.net(C#)访问Oracle数据库出现,不定时出现无效操作。连接被关闭。
--原结果集跟一个高中低的临时表,进行full join
--你试试,我没测试with tab1 as(
select 'a' name, '高' lv, 2 qty from dual union all
select 'a', '中', 5 from dual union all
select 'b', '高', 2 from dual union all
select 'c', '低', 8 from dual
),
tab2 as(
select '高' lv from dual union all
select '中' from dual union all
select '低' from dual
)
select a.name,b.lv,nvl(a.qty,0)
from tab1 a full join tab2 b
on a.lv=b.lv
我提一个意见,因为不知道你的表结构,你的表对于数量必须是not null,不然全外连接时看到右边的会是空值。
with tab1 as(
select 'a' name, '高' lv, 2 qty from dual union all
select 'a', '中', 5 from dual union all
select 'b', '高', 2 from dual union all
select 'c', '低', 8 from dual
),
tab2 as(
select '高' lv from dual union all
select '中' from dual union all
select '低' from dual
)
SELECT b.name, b.lv, nvl(a.qty, 0)
FROM tab1 a
FULL JOIN (SELECT DISTINCT NAME, tab2.lv FROM tab1, tab2) b
ON a.lv = b.lv
AND a.name = b.name
ORDER BY b.name
select 'a' name, '高' lv, 2 qty from dual union all
select 'a', '中', 5 from dual union all
select 'b', '高', 2 from dual union all
select 'c', '低', 8 from dual
),
tab2 as(
select '高' lv from dual union all
select '中' from dual union all
select '低' from dual
)
SELECT b.name, b.lv, nvl(a.qty, 0)
FROM tab1 a
FULL JOIN (SELECT DISTINCT NAME, tab2.lv FROM tab1, tab2) b
ON a.lv = b.lv
AND a.name = b.name
ORDER BY b.name
with tb as
(select 'a' name, '高' 风险等级 ,2 数量 from dual union all
select 'a', '中', 5 from dual union all
select 'b', '高', 2 from dual union all
select 'c', '低', 8 from dual )
select a.name,a.风险等级,nvl(d.数量,0) 数量
from (select name,风险等级
from (select distinct name from tb) b,
(select distinct 风险等级 from tb) c) a left join tb d on a.name=d.name and a.风险等级=d.风险等级
order by a.name
SQL> with tb as
2 (select 'a' name, '高' 风险等级 ,2 数量 from dual union all
3 select 'a', '中', 5 from dual union all
4 select 'b', '高', 2 from dual union all
5 select 'c', '低', 8 from dual )
6 select a.name,a.风险等级,nvl(d.数量,0) 数量
7 from (select name,风险等级
8 from (select distinct name from tb) b,
9 (select distinct 风险等级 from tb) c) a left join tb d on a.name=d.name and a.风险等级=d.风险等级
10 order by a.name
11 /
NAME 风险等级 数量
---- -------- ----------
a 低 0
a 中 5
a 高 2
b 高 2
b 低 0
b 中 0
c 低 8
c 中 0
c 高 0
9 rows selected