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您是待聘人员吗?再一次来拯救我。谢谢你,鲁克