我有以下模拟表:
+---------+-------------------+------+------+
| NAME | TITLE | SIZE | Hit |
+---------+-------------------+------+------+
| A | Hippo1 | H | 0 |
| A | Hippo2 | H | 0 |
| A | Hippo3 | H | 1 |
| A | Hippo1 | M | 0 |
| A | Hippo2 | M | 1 |
| A | Hippo3 | M | 1 |
| A | Hippo1 | L | 0 |
| A | Hippo2 | L | 1 |
| A | Hippo3 | L | 1 |
+---------+-------------------+------+------+
| B | Snail1 | H | 1 |
| B | Snail1 | M | 0 |
| B | Snail1 | L | 1 |
+---------+-------------------+------+------+
| C | Dog | H | 1 |
| C | Dog | M | 0 |
+---------+-------------------+------+------+
| D | Sheep | H | 0 |
| D | Sheep | L | 1 |
+---------+-------------------+------+------+
| E | Fish | H | 1 |
| E | Fish | H | 1 |
+---------+-------------------+------+------+
我想要的结果是
+---------+----------+-------+
| NAME | TITLE | SCORE |
+---------+----------+-------+
| A | Hippo | 100 |
| B | Snail | 80 |
| C | Dog | 80 |
| D | Sheep | 10 |
| E | Fish | 100 |
+---------+----------+-------+
所需的计算:
- Type最多只能有三个值:{H, M, L};
- 当所有值都存在时,它们的分级如下:H=70 M=20 L=10
所有独特的情况都是
- 案例{H,M}:H=80 M=20
- 案例{M,L}:M=60 L=40
- 案例 {H,L} : H=90 L=10
- 案例{H}:H=100
- 案例{M}:M=100
- 案例{L}:L=100
- 案例 {H,M,L}:H=70 M=20 L=10
解释:
Hippo Has case {H,M,L}
Snail has case {H,M,L}
Dog has case {H,M}
Sheep has case {H,L}
Fish has case {H}
进一步说明
Hippo :虽然不是所有尺寸都有命中,但 Hippo 获得了 100 分,因为每个标题至少有 1 个案例被满足一次。因此 HIPPO3 具有所有三个 H
M
L
满足所以 hippo 可以被认为是 100% 找到
从上面提取(线条是观众的逻辑构造)
| A | Hippo1 | H | 0 |
| A | Hippo2 | H | 0 |
| A | Hippo3 | H | 1 | <--Here
+-------------------------------------------+
| A | Hippo1 | M | 0 |
| A | Hippo2 | M | 1 |
| A | Hippo3 | M | 1 | <--Here
+-------------------------------------------+
| A | Hippo1 | L | 0 |
| A | Hippo2 | L | 1 |
| A | Hippo3 | L | 1 | <--Here
最佳答案
给你:
select name, sum(FinalVal) Score from (
select distinct t.name,
case
when size = 'H' then Hval
when size = 'M' then Mval
else Lval
end FinalVal
from (
select name,
case
when sizes = 'H,L,M' then 70
when sizes = 'H,M' then 80
when sizes = 'H,L' then 90
when sizes = 'H' then 100
else 0
end Hval,
case
when sizes = 'H,L,M' then 20
when sizes = 'H,M' then 20
when sizes = 'L,M' then 60
when sizes = 'M' then 100
else 0
end Mval,
case
when sizes = 'H,L,M' then 10
when sizes = 'L,M' then 40
when sizes = 'H,L' then 10
when sizes = 'L' then 100
else 0
end Lval
from (
select name, group_concat(distinct size order by size) sizes from t
group by name
) s1
) s2
join t on t.name = s2.name
where hit
) final
group by name
不清楚如何在给定数据的情况下获取标题(实际上结果中包含原始表中不存在的数据,例如 Hippo
,而不是 Hippo1
. 但我会把它留给你。
这将导致:
+------+-------+
| NAME | SCORE |
+------+-------+
| A | 100 |
| B | 80 |
| C | 80 |
| D | 10 |
| E | 100 |
+------+-------+
关于MySQL 我怎样才能实现这个查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9811980/