MySQL, как мне исправить этот подзапрос? - PullRequest
1 голос
/ 02 марта 2012

У меня есть следующая таблица:

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};
  • Когда все значения присутствуют, они классифицируются следующим образом:

    H = 70 M = 20 L = 10

  • Если имя имеет более одного типа (H, M или L), то баллы распределяются следующим образом:

  • H / (количество H); М / (число М); L / (число L) = 100

- Пример: A имеет 4 H, поэтому 70/4 = 17,5 для каждого H

Но некоторые имена имеют полный набор, не имеющий всех типов. - пример: C имеет значения типа: только 'H & M`

  • ДЕЛО H & M

H = 80 M = 20

  • CASE M & L

М = 60 л = 40

  • CASE H & L

H = 90 L = 10

А также

  • если только H является преснетом H = 100

  • если только М является преснетом М = 100

  • если только L является преснетом L = 100

1 Ответ

2 голосов
/ 03 марта 2012

Если я правильно понимаю, это то, что вы хотите:

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
;
...