我现在经过一系列查询得到以下结果: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?想了半天没有结果,期望大家能给我点思路,谢谢!

解决方案 »

  1.   

    select t.name,r1,tabl1.数量
    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.风险等级
      

  2.   

    楼主可以行转列转一下;
    如楼主查出的结果集当成一个表:
    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)
      

  3.   


    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
    */
      

  4.   

    谢谢各位,最后采用了ACMAIN_CHM的方法,已经能查出我想要的结果了,特别感谢ACMAIN_CHM