Mysql SQL两个表的百分比合计如何随时间变化
您好,我有一个关于SQL结构的问题。我已经弄明白了其中的一些,但我无法得到其余的 用户表Mysql SQL两个表的百分比合计如何随时间变化,mysql,sql,database,sqlite,Mysql,Sql,Database,Sqlite,您好,我有一个关于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
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
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
如何编写查询以实现上述表格
谢谢大家! 只需将这两个查询的结果合并在一起:
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没有通用的表表达式;您必须使用视图或子查询。)对于MySQL,它可能是这样的:
OS percent-done
Mobile 0.5
Windows 0.5
Mac 1
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
谢谢你的回答,经过几次修改后,效果很好