【问题标题】:Proportion in SQL [closed]SQL中的比例[关闭]
【发布时间】:2020-10-17 23:39:41
【问题描述】:

我的桌子是这样的

C1   Bool    Count

A    TRUE     5
A    FALSE    5
B    FALSE    6
C    TRUE     2
C    FALSE    8

我想计算每种 Bool 类型的计数部分,按 C1 分组。理想的结果应该是

C1   Bool    Portion

A    TRUE     0.5
A    FALSE    0.5
B    FALSE    1
C    TRUE     0.2
C    FALSE    0.8

我不确定如何实现这一点。非常感谢任何帮助

【问题讨论】:

    标签: mysql sql sum subquery window-functions


    【解决方案1】:

    这与您之前的问题非常相似,但没有聚合。

    如果你运行的是 MySQL 8.0,你可以使用窗口函数:

    select t.*, count / sum(count) over(partition by c1) ratio
    from mytable t
    

    在早期版本中,替代方法是连接或相关子查询:

    select t.*, count / (select sum(t1.count) from mytable t1 where t1.c1 = t.c1) ratio
    from mytable t
    

    【讨论】:

    • 也许你应该乘以 1.0 以获得浮点结果。等等……我认为 MySQL 默认使用浮点数。
    • @TheImpaler:事实上,MySQL 不做整数除法,所以它是这样工作的。
    【解决方案2】:

    您可以添加子查询来获取 SUM

    你也可以对结果进行四舍五入。

    CREATE TABLE table1 (
      `C1` VARCHAR(1),
      `Bool` VARCHAR(5),
      `Count` INTEGER
    );
    
    INSERT INTO table1
      (`C1`, `Bool`, `Count`)
    VALUES
      ('A', 'TRUE', '5'),
      ('A', 'FALSE', '5'),
      ('B', 'FALSE', '6'),
      ('C', 'TRUE', '2'),
      ('C', 'FALSE', '8');
    
    SELECT `C1`, `Bool`,  `Count` / (SELECT SUM(`Count`) sumcount FROM table1 WHERE `C1` = t1.`C1`) perc
    FROM table1 t1
    
    C1 |布尔 |聚氯乙烯 :- | :---- | -----: 一个 |真的 | 0.5000 一个 |错误 | 0.5000 乙|错误 | 1.0000 C |真的 | 0.2000 C |错误 | 0.8000

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多