2012-03-30 4 views
0

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

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 даст мне мое третье значение, скажем, H. В моей таблице запросов я хочу значения A, B и H. Можете ли, пожалуйста, сказать мне, как я могу это сделать. Его немного сложно, и он не смог справиться с этим. Пожалуйста помоги. Благодарю.

+1

Опубликовать некоторый образец вход и выход. Это намного проще, мой дорогой друг. :) – Teja

+0

Итак, как это отличается от http://stackoverflow.com/questions/9937973/using-aggregate-functions-in-sql-query? – Fionnuala

ответ

0

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

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 и использовать внутреннее соединение, если вы не хотите, чтобы получить продукты, которые не имеют соответствующих записей в ATT_Table

Смежные вопросы