【问题标题】:SQL how percent totals from two tables change over timeSQL 如何随时间变化两个表的百分比总计
【发布时间】:2016-12-16 07:22:42
【问题描述】:

您好,我有一个关于 SQL 结构的问题。我想出了一些,但我无法得到其余的。

用户表

user    OS_signup
1       Mobile
2       Windows
3       Mac
4       Mobile
5       Windows

地牢桌

    user  dungeon     progress  status      OS_completed  deaths
    1     Dungeon 1   1         finished    Windows       0
    1     Dungeon 1   2         incomplete  Windows       0
    2     Dungeon 2   1         finished    Windows       1
    3     Dungeon 2   1         finished    Mac           1
    3     Dungeon 1   2         finished    Mac           3
    3     Dungeon 3   3         incomplete  Mac           0
    4     Dungeon 1   1         finished    Mobile        1
    5     Dungeon 1   1         incomplete  Windows       5

在比较完成第一个地下城第一关的用户与拥有游戏帐户的用户的百分比时,哪个操作系统最受欢迎?

我有这个问题

SELECT OS_signup, count(*) AS count_total
FROM users
GROUP BY OS_signup

还有这个

SELECT OS_completed, count(*) AS count_completed
FROM dungeons
WHERE dungeon = "Dungeon 1" AND progress >=1 AND status = "finished"
GROUP BY OS_completed

我显然得到了两个表,但我想编写一个输出组合表的查询,以便我得到一个如下所示的表:

OS          percent-done
Mobile      0.5
Windows     0.5
Mac         1

如何编写查询来实现上述表格?

谢谢!

【问题讨论】:

    标签: mysql sql database sqlite


    【解决方案1】:

    对于 MySQL,它可能是这样的:

    SELECT OS_signup, count(*) AS count_total, COUNT(tmp.user_id) as count_completed, COUNT(tmp.user_id) / COUNT(*) as percent
    FROM users
    LEFT JOIN (
        SELECT user_id
        FROM dungeons
          WHERE dungeon = 'Dungeon 1' AND progress >= 1 AND status = 'finished'
        GROUP BY user_id
        ) tmp ON tmp.user_id = users.id
    GROUP BY OS_signup
    

    【讨论】:

    • 感谢您的回答,经过几次修改后效果很好
    【解决方案2】:

    只需将这两个查询的结果连接在一起即可:

    WITH total(OS, count_total) AS (
      SELECT OS_signup, count(*)
      FROM users
      GROUP BY OS_signup
    ),
    completed(OS, count_completed) AS (
      SELECT OS_completed, count(*)
      FROM dungeons
      WHERE dungeon = 'Dungeon 1'
        AND progress >= 1
        AND status = 'finished'
      GROUP BY OS_completed
    )
    SELECT OS,
           count_total,
           count_completed,
           CAST(count_completed AS FLOAT) / count_total AS percent
    FROM total
    JOIN completed USING (OS)
    ORDER BY ...;
    

    (MySQL 没有公用表表达式;您必须改用视图或子查询。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      相关资源
      最近更新 更多