我现在经过一系列查询得到以下结果: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?想了半天没有结果,期望大家能给我点思路,谢谢!
from (
select distcint name,r1
from tabl1,(select '高'as rl union all select '中'as rl union all select '低'as rl )b
)t left join tabl1 on t.name=tabl1.name and t.rl=tabl1.风险等级
如楼主查出的结果集当成一个表:
mysql> select * from err;
+------+----------+------+
| name | 风险等级 | 数量 |
+------+----------+------+
| a | 高 | 2 |
| a | 中 | 5 |
| b | 高 | 2 |
| c | 低 | 8 |
+------+----------+------+
4 rows in set (0.01 sec)
则:
mysql> select name,max(case when `风险等级`='高' then `数量` else 0 end) as `高`
,
-> max(case when `风险等级`='中' then `数量` else 0 end) as `中`,
-> max(case when `风险等级`='低' then `数量` else 0 end) as `低`
-> from err
-> group by name;
+------+------+------+------+
| name | 高 | 中 | 低 |
+------+------+------+------+
| a | 2 | 5 | 0 |
| b | 2 | 0 | 0 |
| c | 0 | 0 | 8 |
+------+------+------+------+
3 rows in set (0.00 sec)
use db
godeclare @tb table(
c1 varchar(10)
,c2 varchar(10)
,qty int
);insert into @tb select 'a','高',8 union all select 'a','中',6 union all select 'b','中',2 ;
--select * from @tb;
-- select * from @tb a cross join (select '高' as le union all select '中' union all select '低') b
with cte as
(
select * from @tb a cross join (select '高' as le union all select '中' union all select '低') b
)select b.*,isnull(x.qty,0) as qty from
(
select le,c1 from cte group by le,c1
) b
left join @tb x on b.le=x.c2 and b.c1=x.c1
order by c1
-- 这个是mssql版的,mysql我不熟只能说一下思想了。
原表
/*
c1 c2 qty
---------- ---------- -----------
a 高 8
a 中 6
b 中 2-- 与一个高,中,低三行的一个表cross join c1 c2 qty le
---------- ---------- ----------- ----
a 高 8 高
a 高 8 中
a 高 8 低
a 中 6 高
a 中 6 中
a 中 6 低
b 中 2 高
b 中 2 中
b 中 2 低再按 le,c1分组
le c1
---- ----------
低 a
低 b
高 a
高 b
中 a
中 b
再与原表做一次连接
le c1 qty
---- ---------- -----------
低 a 0
高 a 8
中 a 6
低 b 0
高 b 0
中 b 2
*/