SQL-запрос на вложенный выбор с условием

#mysql #sql

Вопрос:

В этом случае я хочу выбрать среднее значение значений в столбце значение на основе вложенного условия:

  1. Во-Первых, я должен Сгруппироваться По «Кластеру». Если есть хотя бы одно или более «N», я беру среднее значение и отмечаю его как ВЫХОДНОЙ СТОЛБЕЦ Для этого кластера. Дополнительное Условие:
  2. Если в этом кластере есть все Y (столбец HCF Y/N) (пример BC2), сгруппируйте их по столбцу «PL», а затем возьмите среднее значение этих значений.
  3. Если в PL есть все Y(пример PL2), сгруппируйте их по «Заводу» и возьмите среднее значение этих значений.
  4. Если на заводе есть все Y, вы отмечаете значение по умолчанию N/A.

Весь вышеперечисленный выбор должен подразумеваться в этом кластере для этой комбинации BG Mat растений. Как для этого сформировать SQL-запрос?

Вот образец для этого

Комментарии:

1. Пожалуйста, не ссылайтесь на изображения данных, добавьте информацию в виде редактируемого текста в свой вопрос 1) Гораздо сложнее понять ваш вопрос, когда информация и данные находятся в разных местах 2) если кто-то хочет опробовать возможное решение, ему нужно иметь возможность копировать ваши данные, а не вводить их вручную

2. 1) Предоставьте примеры данных в виде СОЗДАТЬ ТАБЛИЦУ ВСТАВИТЬ В скрипт. 2) Примеры данных должны включать группы для каждого условия в вашем списке условий. 3) Предоставьте желаемые выходные данные для этого образца данных. 4) Укажите точную версию MySQL.

Ответ №1:

Вашим условиям довольно трудно следовать, потому что ваш образ включает в себя только одно или два из них. Но вам, похоже, нужны средние значения по условным окнам:

 select t.*,
       (case when sum(hcv = 'N') over (partition by cluster) > 0
             then avg(value) over (partition by cluster)
             when sum(hcv = 'N') over (partition by pl) > 0
             then avg(value) over (partition by pl)
             when sum(hcv = 'N') over (partition by plant) > 0
             then avg(value) over (partition by plant)
        end) as output
from t;
 

Обратите внимание , что значение по умолчанию равно NULL «нет 'N/A' «. AVG() возвращает число, которое не должно смешиваться со строками.