2012-03-21 85 views
1

我有以下的模拟表:MySQL我该如何实现这个查询?

+---------+-------------------+------+------+ 
| 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
  • ALL独特casese是

    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. Cas E {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} 

进一步的解释

河马:虽然并非所有的大小都有一击,但Hippo已经获得了100分,因为每个病例至少有1个已经满足了一次每题。因此HIPPO3有三个HM L satsified所以河马可以conidered发现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 
+1

除非你确实有一个动物园)是这个家庭作业? – 2012-03-21 20:05:36

+0

没关系,如果是这样,我们会提供帮助,如果是这样,只需要这样标记即可。 – 2012-03-21 20:06:09

+0

不,我向你保证这不是作业 – stackoverflow 2012-03-21 20:07:26

回答

1

在这里你去:

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

我不知道什么是布莱恩,但是我尝试了上面提供的没有运气的东西 – stackoverflow 2012-03-22 12:22:38

+1

Here是一个[工作示例](http://sqlfiddle.com/#!2/59ec7/26) – 2012-03-22 12:35:10

+0

我可以编辑这也主要Mostacho? – stackoverflow 2012-03-22 13:18:45