2012-04-27 7 views
1

Возможно, я уже опубликовал это ранее, но пока не могу найти ответ, поэтому, пожалуйста, помогите мне в этом.Нужна помощь для моего SQL-запроса

Моя структура базы данных:

ATT (Activity стол)

  • Act_ID (PK)
  • Assigned_To_ID (FK, см Emp_ID)
  • PROJECT_ID (FK, см Project_ID)
  • Product_ID (FK, см. Product_ID)
  • Статус (может быть New, OnHold, Cancel, Closed)

Product_Table

  • PRODUCT_ID (ПК)
  • Product_Name

Project_Table

  • project_id (ПК)
  • PROJECT_NAME

Employee_Table

  • emp_id (ПК)
  • F_Name.

Ограничения

  • В 1 Project -> Несколько сотрудников могут работать
  • 1 сотрудника -> Может быть назначено несколько мероприятий (Act_ID)
  • В любой данный момент времени Status может быть любым из этих данных

Сейчас в мой SQL запрос, что я хочу сделать, это проверка нагрузки ::

Деятельность (в лице Act_ID) присваивается работнику представлен Assigned_To_ID, для проекта (Project_ID в ATT_Table) и особый статус. Мне нужно вывести 5 значений из моего SQL запроса:

  1. Имя Сотрудника
  2. Название проекта
  3. Количество общей деятельности Сотрудник (в А) назначается.
  4. Число операций, выполняемых работником (в A), назначается там, где Status является либо новым, либо InProcess.
  5. Нагрузка. Это будет = C/D * 100 (C является большее значение, чем D, что очевидно.)

Теперь Там может быть условием, что работник, скажем E1 работает над проектом P1, P2. Так что мой выход таблица будет выглядеть следующим образом ::

A B  C D  E 
E1 P1  
E1 P2 

Так вот C, D, E будут иметь значения, соответствующие деятельности для данного проекта (P1 или P2)

Я попытался это до сих пор ::

SELECT 
    F_Name AS A, 
    Project_Name AS B, 
    Count(Act_ID) AS C, 
    Count(Act_ID) AS D 
FROM 
    Employee_Table, ATT_Table, Project_Table 
WHERE 
    ATT_table.[Assigned_To_ID] = Employee_Table.[Emp_ID] 
    AND Project_Table.[Project_ID] = ATT_Table.[Project_ID] 
    AND Count(Act_ID) IN (SELECT Count(Act_ID) 
          FROM ATT_Table 
          WHERE ATT_Table.[Status] <> 'Closed' 
          AND ATT_Table.[Status] <> 'OnHold') 
GROUP BY 
    F_Name, Project_Name; 

Я получаю A, B, C. Но когда я пытаюсь найти мероприятия для проверки состояния я не могу выполнить этот запрос, поскольку это дает мне сообщение не может написать подсчитывать в ИНЕКЕ. пожалуйста, помогите мне на этом. Спасибо ..

ответ

1

Product_Table Вы упомянули, но я не вижу, как эта таблица участвует в вашем вопросе. В остальном я бы вытащил столбцы A, B, C и D из подзапроса и вычислил E во внешнем запросе.

SELECT 
    sub.F_Name AS A, 
    sub.Project_Name AS B, 
    sub.C, 
    sub.D, 
    ((sub.C/sub.D) * 100) AS E 
FROM 
    (
     SELECT 
      Emp.F_Name, 
      Proj.Project_Name, 
      Count(att.Act_ID) AS C, 
      Sum(IIf(att.Status IN ('New', 'InProcess'), 1, 0)) AS D 
     FROM 
      (ATT_Table AS att 
      INNER JOIN Employee_Table AS Emp 
      ON Emp.Emp_ID = att.Assigned_To_ID) 
      INNER JOIN Project_Table AS Proj 
      ON Proj.Project_ID = att.Project_ID 
     GROUP BY 
      Emp.F_Name, 
      Proj.Project_Name 
    ) AS sub; 
+0

Yaa .. я извиняюсь за это. Product_Table не задействован. Моя ошибка .. –

+0

Сэр, у меня есть это 1 право. Но сегодня я знаю немного о том, что немного изменился в моих требованиях. Поэтому я опубликовал новый вопрос, его несколько связанный только с этим. Я отметил это как ответ, поскольку он подходит для этого вопроса. Я даю вам ссылку http://stackoverflow.com/questions/10373043/need-to-write-an-sql-query Спасибо. –

1
SELECT 
     E1.F_Name AS A, 
     P1.Project_Name AS B, 
     Count(A1.Act_ID) AS C, 
     sum(IF(A1.Status IN ('Closed', 'OnHold'), 0, 1)) as D, 
     (Count(A1.Act_ID)/sum(IIF(A1.Status IN ('Closed', 'OnHold'), 0, 1))) * 100 as E 
    FROM 
     ATT_Table A1 
     JOIN Employee_Table E1 
      ON A1.Assigned_To_ID = E1.Emp_ID 
     JOIN Project_Table P1 
      ON A1.Project_ID = P1.Project_ID 
    GROUP BY 
     F_Name, Project_Name; 
+0

Ну, сэр Спасибо за ваш ответ. Но когда я запускаю его в своем MSaccess в SQL-запросе. Я получаю ошибки, такие как Синтаксическая ошибка в предложении FROM, которая затем указывает мне на JOIN, я написал в разделе FROM. А также получение ошибки "undefined function IF". Одна вещь, которую я заметил, у вас написала S1.Status .. Но где S1? Пожалуйста помоги. Еще раз спасибо. –

+0

@ user1230183, Извините, у вас не было назначения «TAG», что это был запрос ACCESS. Они имеют несколько иной синтаксис. Я изменился с SUM (IF()) на SUM (IIF()) – DRapp

+0

Но как насчет 'S1'? Возможно, вы имели в виду «А1»? –

1

Может быть, так. попробовать ....

Select Emp.F_Name As A, 
    Proj.Project_Name As B, 
    Count(ATT.Act_ID) As C, 
    sum(IIF(ATT.Status IN ('Closed', 'OnHold'), 0, 1)) as D, 
    (Count(ATT.Act_ID)/sum(IIF(ATT.Status IN ('Closed', 'OnHold'), 0, 1))) * 100 as E 
From Employee_Table As Emp Inner Join 
    (Product_Table As Prod Inner Join 
    (ATT_Table As ATT Inner Join Project_Table As Proj On Proj.Project_ID=ATT.Project_ID) 
    On Prod.Product_ID=ATT.Product_ID) 
    On Emp.Emp_ID=ATT.Assigned_To_ID 
Group By Emp.F_Name,Proj.Project_Name 
+0

Сэр, сегодня я знаю, что немного изменился в моих требованиях, поэтому у меня есть опубликовал новый вопрос, его несколько связанный только с этим. Могу ли я помочь мне с этим http://stackoverflow.com/questions/10373043/need-to-write-an-sql-query Спасибо. –

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