繁体   English   中英

MySQL如何实现此查询?

[英]MySQL how can I achieve this query?

我有以下模拟表:

+---------+-------------------+------+------+
| 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  |
+---------+----------+-------+

所需的计算:

  • 类型最多只能有三个值:{H,M,L};
  • 当所有值都存在时,对其进行如下分级:H = 70 M = 20 L = 10
  • 所有独特的情况都是

    1. 情况{H,M}:H = 80 M = 20
    2. 情况{M,L}:M = 60 L = 40
    3. 情况{H,L}:H = 90 L = 10
    4. 情况{H}:H = 100
    5. 情况{M}:M = 100
    6. 情况{L}:L = 100
    7. 情况{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} 

进一步说明

河马:尽管并非所有规模的人都能受命,但河马之所以能获得100分,是因为每个案例至少有1个满足了要求。 因此, HIPPO3满足了所有三个H M L要求,因此可以考虑发现河马 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 |
+------+-------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM