MYSQL-запрос для получения всех результатов, когда один столбец встречается более одного раза в разных группах и соответствует определенным условиям. - PullRequest
0 голосов
/ 09 декабря 2018

Допустим, у меня есть следующие данные:

object    size    color    units
------    ----    -----    -----
ball      small   red      3
ball      small   red      2
ball      medium  blue     2
ball      medium  blue     1
ball      big     yellow   2
hat       big     green    3
hat       big     green    4
umbrella  medium  blue     1
umbrella  medium  blue     4
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1
book      small   white    4
book      small   brown    3
book      medium  brown    2

Мне нужен запрос, который возвращает все вариации объект-цвет-размер для всех объектов, для которых хотя бы одна из общих единиц вариации для этого размера иcolor, по крайней мере, 5, поэтому запрос будет возвращать эти строки:

object    size    color    total_units
------    ----    -----    ------
ball      small   red      5
ball      medium  blue     3
ball      big     yellow   2
umbrella  medium  blue     5
umbrella  big     blue     4
umbrella  huge    red      2
umbrella  huge    green    1

Причина, по которой все шары и их итоговые значения по размеру цвета появляются в результатах, заключается в том, что существует как минимум 2 разныхшары и общее количество единиц, по крайней мере, одного из них составляет 5 или более

Причина, по которой все зонтики и их итоговые значения в зависимости от цветовой вариации появляются в результатах, заключается в том, что имеется как минимум 2 разных зонтика иобщее количество единиц по крайней мере одного из них составляет 5 или более

Причина, по которой шляпа не появляется в результатах, заключается в том, что, хотя более 5 единиц (7) шляпы большого зеленого цвета,НЕ по крайней мере 2 разных шляпы

Причина, по которой ни одна из книг не появляется в результатах, заключается в том, что хотя есть 3 разныхks, ни одного из них не менее 5 единиц.

Спасибо, что показали мне, как это можно сделать!

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018
  • В производной таблице мы можем определить уникальные значения Object, которые имеют не менее 1 комбинации, а одна из комбинаций имеет как минимум 5 единиц.
  • Присоединиться назадв основную таблицу, чтобы получить только эти строки (post GROUP BY).

Запрос

SELECT 
  t.object, t.size, t.color, SUM(t.units) AS total_units 
FROM 
your_table AS t
JOIN 
(
  SELECT dt.object 
  FROM 
  (
    SELECT
      object, size, color, SUM(units) AS total_units 
    FROM your_table 
    GROUP BY 
      object, size, color
  ) AS dt 
  GROUP BY dt.object 
  HAVING COUNT(*) > 1 AND 
         SUM(dt.total_units >= 5) /* atleast one with 5 units */
) AS dt2 
  ON dt2.object = t.object
GROUP BY t.object, t.size, t.color;

Результат

| object   | size   | color  | total_units |
| -------- | ------ | ------ | ----------- |
| ball     | big    | yellow | 2           |
| ball     | medium | blue   | 3           |
| ball     | small  | red    | 5           |
| umbrella | big    | blue   | 4           |
| umbrella | huge   | green  | 1           |
| umbrella | huge   | red    | 2           |
| umbrella | medium | blue   | 5           |

Просмотр на БД Fiddle

0 голосов
/ 09 декабря 2018

Используя оконные функции (в самых последних версиях баз данных MySQL и MariaDB), это легко:

select object, size, color, total_units
from (select object, size, color, sum(units) as total_units,
             max(sum(units)) over (partition by object) as max_total_units,
             count(*) over (partition by object) as cnt
      from t
      group by object, size, color
     ) t
where max_total_units >= 5 and cnt > 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...