1

これも以前に投稿した可能性がありますが、これまで答えが見つからなかったので、これで私を助けてください。

私のデータベース構造:

ATTActivity表)

  • Act_ID(PK)
  • Assigned_To_ID (外部キー、参照Emp_ID)
  • Project_ID (FK、参照Project_ID)
  • Product_ID (FK、参照Product_ID)
  • ステータス (可能性がありますNew, OnHold, Cancel, Closed)

Product_Table

  • 製品 ID (PK)
  • 商品名

プロジェクト_テーブル

  • プロジェクト ID (PK)
  • プロジェクト名

Employee_Table

  • 従業員 ID (PK)
  • F_名前。

制約

  • 1つのプロジェクトで --> 複数の従業員が働くことができます
  • 1 従業員 -- > 複数の活動を割り当てることができます ( Act_ID)
  • 任意の時点でStatus、これらの指定された値のいずれかになります

今私のSQLクエリでやりたいことは負荷チェックです::

アクティビティ ( で表される) は、プロジェクト (内) および特定のステータスのでAct_ID表される従業員に割り当てられます。SQL クエリから 5 つの値を出力する必要があります。Assigned_To_IDProject_IDATT_Table

  1. 従業員の名前
  2. プロジェクト名
  3. 従業員 (A 内) が割り当てられているアクティビティの合計数。
  4. Status が New または InProcess である Employee(In A) が割り当てられているアクティビティの数。
  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 を取得しています。しかし、ステータス チェックのアクティビティを見つけようとすると、WHERE 句にカウントを書き込めないというメッセージが表示されるため、このクエリを実行できません。これについて私を助けてください。ありがとう..

4

3 に答える 3

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;
于 2012-04-28T21:42:05.733 に答える
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
于 2012-04-28T19:34:00.277 に答える
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;
于 2012-04-27T15:09:11.860 に答える