在 SQL 上,我可以有一个基于多个参数计数的比率列吗?
on SQL can I have a ratio column based on a count of multiple parameters?
在此查询中,我在下面提供的图像中得到以下结果。但是我想更进一步,将计数转换为获胜/总获胜的比率。
然而,当我使用第二个查询(在底部)时,我得到了无效使用组函数的错误。
解释一下,计数基于查询中每个唯一的列组合的分组
有人可以解释一下我做错了什么吗?
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id, Count(*)/
( SELECT SUM(Count(*)) ) AS Ratio
FROM battledata.history
GROUP BY summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id ;
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id, Count(*)/
( SELECT SUM(Count(*)) ) AS Ratio
FROM battledata.history
GROUP BY summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id ;
您需要使用 COUNT(*)
作为子查询(如果有 where 子句则它需要在两个查询中匹配):
SELECT
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id,
COUNT(*) / (SELECT COUNT(*) FROM battledata.history) AS Ratio
FROM battledata.history
GROUP BY
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id
编辑:
如果使用 MySQL 8 或更高版本,您可以使用 window 函数。更正语法后,您的原始查询将起作用:
SELECT
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id,
COUNT(*) / SUM(COUNT(*)) OVER () AS Ratio
FROM battledata.history
GROUP BY
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id, monster_4_id, monster_5_id, monster_6_id
,COUNT(*) / (SELECT COUNT(*) FROM battledata.history) AS Ratio
FROM battledata.history
GROUP BY summoner_id ,monster_1_id,monster_2_id,monster_3_id
,monster_4_id,monster_5_id,monster_6_id
这应该可以满足您的需求。如果您需要添加 WHERE 子句,请记住在两个查询中添加相同的子句
在此查询中,我在下面提供的图像中得到以下结果。但是我想更进一步,将计数转换为获胜/总获胜的比率。
然而,当我使用第二个查询(在底部)时,我得到了无效使用组函数的错误。
解释一下,计数基于查询中每个唯一的列组合的分组
有人可以解释一下我做错了什么吗?
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id, Count(*)/
( SELECT SUM(Count(*)) ) AS Ratio
FROM battledata.history
GROUP BY summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id ;
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id, Count(*)/
( SELECT SUM(Count(*)) ) AS Ratio
FROM battledata.history
GROUP BY summoner_id, monster_1_id, monster_2_id, monster_3_id,
monster_4_id, monster_5_id, monster_6_id ;
您需要使用 COUNT(*)
作为子查询(如果有 where 子句则它需要在两个查询中匹配):
SELECT
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id,
COUNT(*) / (SELECT COUNT(*) FROM battledata.history) AS Ratio
FROM battledata.history
GROUP BY
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id
编辑:
如果使用 MySQL 8 或更高版本,您可以使用 window 函数。更正语法后,您的原始查询将起作用:
SELECT
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id,
COUNT(*) / SUM(COUNT(*)) OVER () AS Ratio
FROM battledata.history
GROUP BY
summoner_id,
monster_1_id,
monster_2_id,
monster_3_id,
monster_4_id,
monster_5_id,
monster_6_id
SELECT summoner_id, monster_1_id, monster_2_id, monster_3_id, monster_4_id, monster_5_id, monster_6_id
,COUNT(*) / (SELECT COUNT(*) FROM battledata.history) AS Ratio
FROM battledata.history
GROUP BY summoner_id ,monster_1_id,monster_2_id,monster_3_id
,monster_4_id,monster_5_id,monster_6_id
这应该可以满足您的需求。如果您需要添加 WHERE 子句,请记住在两个查询中添加相同的子句