我有下表:
select * from points
+---------+-------------------+------+------+
| NAME | TITLE | Type | RANK |
+---------+-------------------+------+------+
| A | Hippo | H | 1 |
| A | Hippo | M | 1 |
| A | Hippo | H | N/A |
| A | Hippo | H | 1 |
| A | Hippo | H | N/A |
| B | Snail | H | 1 |
| B | Snail | M | 1 |
| B | Snail | L | 1 |
| C | Dog | H | 1 |
| C | Dog | M | 1 |
+---------+-------------------+------+------+
期望的输出
+---------+----------+-------+
| NAME | TITLE | SCORE |
+---------+----------+-------+
| A | Hippo | 60 | <--[(2xH)=40 + (1xM)=20] =60
| B | Snail | 100 | <--[(1xH)=70 + (1xM)=20 + (1xL)=10] =100
| C | Dog | 100 | <--This should happen because [(1xH)=80 + (1xM)=20] =100
+---------+----------+-------+
所需的计算:
- 类型只能有三个值:{H, M, L};
当所有值都存在时,它们的分级如下:
高=70 米=20 长=10
如果一个名称有不止一种类型(H、M 或 L),则点数分配如下:
H/(H 的数量); M/(M个数); L/(L的数量)= 100
-- 示例:A 有 4 个 H,因此每个 H 有 70/4 = 17.5
但有些名称具有完整的集合,但没有所有“类型”。 -- 示例:C 的类型值:仅 'H&M`
- CASE H&M
高=80 米=20
- 案例 M&L
M=60 L=40
- CASE H&L
高=90 长=10
还有
如果只有 H 是 presnet H=100
如果只有 M 是 presnet M=100
如果只有 L 是 presnet L=100
最佳答案
如果我没理解错的话,这就是你想要的:
SELECT name,
title,
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 0 -- ??????????
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,
title,
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,
title
) t
ORDER
BY name
;
关于MySQL 如何更正此子查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9538501/