Mysql 如何修复此查询以使列值相乘
我有这张桌子Mysql 如何修复此查询以使列值相乘,mysql,subquery,Mysql,Subquery,我有这张桌子 select * from points +---------+------+------+ | NAME | Type | RANK | +---------+------+------+ | A | H | 90 | | A | M | 100 | | A | H | N/A | | A | H | N/A | | A | H | N/A | | B | H
select * from points
+---------+------+------+
| NAME | Type | RANK |
+---------+------+------+
| A | H | 90 |
| A | M | 100 |
| A | H | N/A |
| A | H | N/A |
| A | H | N/A |
| B | H | 100 |
| B | M | 100 |
| B | L | 100 |
| C | H | 85 |
| C | M | 100 |
+---------+------+------+
我正在使用此查询
SELECT name,
CAST(
( -- only have H, or only have M, or only have L:
CASE WHEN `# of H` = 0 AND `# of M` = 0 THEN 100 * `# of active L` / `# of L`
WHEN `# of H` = 0 AND `# of L` = 0 THEN 100 * `# of active M` / `# of M`
WHEN `# of M` = 0 AND `# of L` = 0 THEN 100 * `# of active H` / `# of H`
-- only have H & M, or only have H & L, or only have M & L:
WHEN `# of H` = 0 THEN 60 * `# of active M` / `# of M` + 40 * `# of active L` / `# of L`
WHEN `# of M` = 0 THEN 90 * `# of active H` / `# of H` + 20 * `# of active L` / `# of L`
WHEN `# of L` = 0 THEN 80 * `# of active H` / `# of H` + 20 * `# of active M` / `# of M`
-- have all three:
ELSE 70 * `# of active H` / `# of H` + 20 * `# of active M` / `# of M` + 10 * `# of active L` / `# of L`
END
) AS SIGNED ) AS score
FROM ( SELECT name,
SUM(IF( type = 'H', 1, 0)) AS `# of H`,
SUM(IF(rank AND type = 'H', 1, 0)) AS `# of active H`,
SUM(IF( type = 'M', 1, 0)) AS `# of M`,
SUM(IF(rank AND type = 'M', 1, 0)) AS `# of active M`,
SUM(IF( type = 'L', 1, 0)) AS `# of L`,
SUM(IF(rank AND type = 'L', 1, 0)) AS `# of active L`
FROM points
GROUP BY name
) t
ORDER
BY name
;
我得到这个输出
+---------+-------+
| NAME | SCORE |
+---------+-------+
| A | 60 | <--[(2xH)=40 + (1xM)=20] =60
| B | 100 | <--[(1xH)=70 + (1xM)=20 + (1xL)=10] =100
| C | 100 | <--[(1xH)=80 + (1xM)=20] =100
+---------+-------+
+---------+-------+
| NAME | SCORE |
+---------+-------+
| A | 36 | <--[70/4=(17.5 per H) therefore (17.5)*(rank of that h: 90%)=15.75 + (M values, which equals 20/1 =20 Therefore: rank of that m:100% * 20 = 100) = 36 rounded
| B | 100 | <--[(1xH)=70 + (1xM)=20 + (1xL)=10] =100
| C | 88 | <--[(1xH)=80 + (1xM)=20] =100
+---------+-------+
+---------+-------+
|姓名|分数|
+---------+-------+
|这看起来很熟悉。:-)
您的描述在许多地方不一致-例如,您对a
的“期望输出”使用70
和20
,即使没有a
s具有类型L
-但是如果您的意思是我认为您所做的,那么您需要的主要更改是更改SUM(if(秩和类型='H',1,0))作为活动H的`
的``和(IF(type='H',rank/100.0,0)),作为` H的秩`
(对于M
和L
),并将所有对活动H的`的引用改为引用` H的秩`
。这样,每个记录都将按照其等级的比例被包括在内,而不是成为一个全有或全无的东西
当您将
分数
转换为整数时,您还需要使用而不是CAST
-或者除了CAST
-之外。Ruakh您是待聘人员吗?再一次来拯救我。谢谢你,鲁克