代码之家  ›  专栏  ›  技术社区  ›  Olga Pshenichnikova

统计相似记录中的记录百分比

  •  0
  • Olga Pshenichnikova  · 技术社区  · 6 年前

    我有T桌:

    ID    Type
    ----  ----
    1     a
    1     b
    2     a
    2     a
    3     b
    

    以及第一个表-n中ID名称的表:

    ID    Name
    ----  ----
    1     name1
    2     name2
    3     name3
    

    我需要在pl/sql中查询相同ID(按ID分组)的所有类型中类型出现的计数百分比。

    结果必须是:

    Name   a%   b%     row
    ---    ----  ---   ---
    name1  50    50   1
    name2  100   0    2
    name3  0     100  3
    

    我尝试过:

    select 
        n.name,
        a.perc as "a%",
        b.perc as "b%",
        row_number() over (
            order by name asc
        ) mf_rownumber
    from n n
    left join
        (select 
            id,
            round(100 * (count(*) / sum(count(*)) over ()), 2) perc
        from t
        where (type = 'a')
        group by id) a
        on a.id = n.id
    left join
        (select 
            id,
            round(100 * (count(*) / sum(count(*)) over ()), 2) perc
        from t
        where (type = 'b')
        group by id) b
        on b.id = n.id;
    

    我得到的是所有行中每种类型的百分比:

    Name    a%   b%     row
    ---     ----  ---   ---
    name1   20    20   1
    name2   40    0    2
    name3   0     20   3
    

    但我需要计算相同ID边界中的所有内容,而不是所有行。

    2 回复  |  直到 6 年前
        1
  •  2
  •   Kobi    6 年前

    http://sqlfiddle.com/#!4/6bb2a/20

     select 
        n.name,
        round(100 * (sum(case when type='a' then 1 else 0 end) / count(*)), 2) as "a%",
        round(100 * (sum(case when type='b' then 1 else 0 end) / count(*)), 2) as "b%",
        row_number() over (order by name asc ) mf_rownumber
    from n 
    left join t on t.id = n.id
    group by n.name
    
        2
  •  1
  •   Florin Ghita    6 年前

    select 
        n.name,
        n.id, 
        count(case when type='a' then 1 end)/count(*)*100 as "a%",
        count(case when type='b' then 1 end)/count(*)*100 as "b%" 
    from n left join t on a.id=n.id 
    group by n.id;