Написание SQL-запроса с использованием агрегатных функций. - PullRequest
0 голосов
/ 30 марта 2012

Ну, я уже писал этот тип квестов, но теперь мне нужно сделать это по-другому. У меня есть структура таблицы:

ATT_Table : Fields : Act_ID, Assigned_To_ID, Status, Product

Act_ID является первичным ключом, Assigned_To_ID ссылается на Employee_Table Emp_ID. Статус может быть Новый, В процессе, Закрыт или На удержании. Продукт может иметь любое значение XYZ.

Employee_Table : Fields : Emp_ID, F_Name, Product

Здесь Emp_ID является первичным ключом. Продукт такой же, как в ATT_Table, и будет содержать значения в ATT_Table для каждого Assigned_To_ID, такого же, как он содержится для этого Emp_ID. Например, если Emp_ID равен 1, а Product равен X, то в ATT_Table также для Assigned_To_ID 1 значение Product будет равно X. Я знаю, что это копия, и я могу избежать этого.

Теперь я хочу сделать это. Сначала я хочу найти общее количество сотрудников для каждого продукта. Допустим, это значение равно A. Теперь я хочу подсчитать количество сотрудников, которым назначено конкретное мероприятие, сгруппированных по продукту, и статус которых «Новый» или «В процессе». Допустим, то есть Б. Нравится. Если сотрудники, имеющие F_Name C (Emp_ID = 1), D (Emp_ID = 2), E (Emp_ID = 3), F (Emp_ID = 4), принадлежат продукту X. Таким образом, мой A согласно этому равен 4. Теперь в ATT_Table Assigned_To_ID находятся 1 и 3, и там продукт такой же, т. Е. X и статус 1 (новый) 3 (в процессе). Для 2 и 4 его закрыто или в ожидании. Теперь мой B в соответствии с этим равен 2. Наконец, A / B даст мне мое 3-е значение, скажем, H. В моей таблице запросов я хочу значения A, B и H. Можете ли вы сказать мне, как я могу это сделать. Это немного сложно и не смог попасть на этот. Пожалуйста помоги. Благодарю.

1 Ответ

0 голосов
/ 31 марта 2012

Что-то вроде этого должно сделать это:

SELECT g.product,
   a,
   b,
   g.a / g.b h
  FROM (  SELECT e.product,
             COUNT (DISTINCT assigned_to_id) a,
             COUNT (
                DISTINCT CASE
                            WHEN status IN ('new', 'in process')
                            THEN
                               assigned_to_id
                         END)
                b
        FROM    Employee_Table e
             LEFT OUTER JOIN
                ATT_Table a
             ON (e.emp_id = a.assigned_to_id)
    GROUP BY e.product) g;

Вы можете удалить LEFT OUTER JOIN и использовать INNER join, если вы не хотите получать продукты, которые не имеют соответствующих записей в ATT_Table

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...