2011-01-04 4 views
1

私は3つのデータベーステーブルを持っています:クエリの2行から1行への情報

従業員が行った作業を定義するWorkoutput。 各人物の関係を定義するemployeeinfo。 3つの重要なフィールドは、子、親、および関係です。人は親がメンターやマネージャー

そして最後に関する包括的なリストを持っている標準の従業員表であるかどうかを参照する関係で、すなわち、

child parent relation 
12  3   2 
12  43  4 

異なる関係で を数回に記載されていることができます従業員ID、名前、ログインなど

私はその1人の労働者の上のすべての人を日常的に定義していますが、1行で定義した結果テーブルを持っています。 現時点では、次のクエリで別の日にしか定義できません。

SELECT workoutput.Day, workoutput.Employee, employee.name 
FROM workoutput INNER JOIN 
     employeeInfo ON workoutput.ID = [employeeinfo].son INNER JOIN 
     [employee] ON [employeeInfo].parent = [employee].id INNER JOIN 
     [employee] AS [employee1] ON workoutput.[Employee ID] = [employee1].id 

これは関係を返しますが、大多数の人々は、それらの上の二人(メンターとManager)を持っているように、それぞれの日のための2つの行があるでしょう。

29/03/2010 00:00:00 Employee1 Manager 3 
29/03/2010 00:00:00 Employee1 Mentor 1 

と私は、私も私の処分で別のテーブルを持っている

29/03/2010 00:00:00 Employee1 Mentor 1 Manager3 

が好きidが定義された関係IDを参照すると、それは2行、idと関係の種類を持っている関係を定義しているでしょうemployeeinfoテーブルに格納されます。

これは可能ですか?

ありがとうございました

+0

コードをフォーマットするため、SSRSで実行することが可能だろう –

答えて

0

標準SQLではありません。ここでの通常のアプローチは、テーブルをソートし、それをレポートツールまたはカスタムプログラムへの入力として使用することです。

SQL Serverでは、これを行ったストアドプロシージャを記述することができます。それはあなたがそれをどれくらいひどく望むかによって決まります。

+0

:-) 4つのスペースで '{}'ボタンまたはインデントを使用しますか? – user552311

0

あなたの関係のフィールドが一定であれば(関係タイプのすなわちセットのみの番号)あなたはこのようにそれを移調するCASE文を書くことができます...

SELECT workoutput.Day, workoutput.Employee, 
CASE relation WHEN 2 THEN employee.name END AS relation2, CASE relation WHEN 4 THEN employee.name END AS relation4 
FROM workoutput 
INNER JOIN employeeInfo ON workoutput.ID = [employeeinfo].son 
INNER JOIN [employee] ON [employeeInfo].parent = [employee].id 
INNER JOIN [employee] AS [employee1] ON workoutput.[Employee ID] = [employee1].id 
GROUP BY workoutput.Day, workoutput.Employee, employee.name 

しかし、これにかなり明白な欠点があります新しい関係を追加した場合、あなたはこれがあなたのSPのまたは類似

EDIT 謝罪に制御する厳格なバージョンを持っている場合、私はGROUP BY句をオフ逃しただけを使用する必要がありますので、重複行を取得するために開始すること:)

+0

関係は一定で、私はあなたのメソッドを試しましたが、代替の行にはnull値があります。たとえば、関係2は行1ではNULL、次に行2では関係4は親の名前ではなくヌルです。 – user552311

+0

GROUP BYはこの問題を解決する必要があります。申し訳ありませんが、私はこのアプローチを集約で使用することに慣れていました。 –

1

子供のための親の最大数はありますか?関係)?そして、関係ごとに1つはありますか?

この場合、PIVOTを使用して、現在の出力から希望の出力にすることができます。従業員の識別子とgroup_concat両親に

SELECT wo.Day, wo.Employee, e.name, er1.name, er2.name, etc. 
FROM workoutput AS wo 
INNER JOIN [employee] AS e 
    ON workoutput.[Employee ID] = e.id 

LEFT JOIN employeeInfo AS ei1 
    ON e.ID = ei1.child 
    AND ei1.relation = 1 
LEFT JOIN [employee] AS er1 
    ON ei1.parent = er1.id 

LEFT JOIN employeeInfo AS ei2 
    ON e.ID = ei2.child 
    AND ei2.relation = 2 
LEFT JOIN [employee] AS er2 
    ON ei2.parent = er2.id 

など

+0

これが最良の方法です。ありがとう! – user552311