2012-03-30 13 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と同じです。また、そのEmp_IDのContainsと同じ、各Assigned_To_IDの値をATT_Tableに含めます。 Emp_IDが1、ProductがXの場合、ATT_TableのAssigned_To_ID 1の場合と同様に、Product値はXになります。レプリカを知っていて、それを避けることができます。

今、私がしたいことがあります。まず、各製品の総従業員数を求めます。この値をAとしましょう。特定のアクティビティが割り当てられている従業員の数を、プロダクトごとにグループ化し、ステータスが新規またはインプロセスのどちらであるかを数えたいとします。例Bといいましょう。 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があり、ProductはXと同じで、ステータスは1(新規)3(処理中)です。 2と4の場合は、閉じているか保留中です。これで私のBは2です。最後にA/Bは私に3番目の値を与えます。私のクエリテーブルではA、B、Hの値が欲しいです。その少しトリッキーな、この1つを得ることができませんでした。助けてください。ありがとう。

+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; 

レコードを対応しているしていない製品を取得したくない場合はATT_Table

でLEFT OUTER JOINをし、使用INNERに参加
関連する問題