2011-01-04 5 views
1

Ich habe 3 Datenbanktabellen:Informationen von zwei Zeilen von einer Abfrage in 1 Zeile

Workoutput, die die Arbeit von Mitarbeitern definiert. employeeinfo, die Beziehungen für jede Person definiert. Die drei wichtigen Felder sind Kind, Eltern und Beziehung. Eine Person kann mit verschiedenen Beziehungen, dh,

child parent relation 
12  3   2 
12  43  4 

Mit der Beziehung ein paar Mal aufgeführt wird mit Bezug auf, ob der Elternteil Mentor oder Manager

Und schließlich eine Standard-Mitarbeiter Tabelle, die über die umfassenden Inserate hat Mitarbeiter ID, Name, Login usw.

Ich möchte eine Ergebnistabelle haben, die alle Personen über diesem einen Arbeiter auf einer täglichen Basis definiert, aber es in einer Zeile auf einer täglichen Basis definiert haben. Im Moment kann ich sie nur an einzelnen Tagen mit der folgenden Abfrage definieren.

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 

Dies gibt die Beziehungen, aber es wird zwei Reihen für jeden Tag sein, da die Mehrheit der Menschen über sie (Mentor und Manager) zwei Menschen haben wird.

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

und ich möchte

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

ich einen anderen Tisch zu meiner Verfügung haben auch, die die Beziehungen definieren es zwei Reihen hat, ID und die Art der Beziehung, mit der ID auf eine Beziehung id Bezug definiert in der Mitarbeiterinfo-Tabelle.

Ist das möglich?

Danke

+0

Für Code-Formatierung, verwenden Sie die '{}' Taste oder Einzug von 4 Leerzeichen :-) –

Antwort

0

Nicht mit Standard-SQL. Der übliche Ansatz wäre hier, die Tabelle zu sortieren und sie dann als Eingabe in ein Berichtstool oder ein benutzerdefiniertes Programm zu verwenden.

In SQL Server wäre es möglich, eine gespeicherte Prozedur zu schreiben, die dies getan hat. Es hängt davon ab, wie schlecht Sie es wollen.

+0

das möglich wäre, in SSRS zu tun? – user552311

0

wenn Sie Ihre Beziehung Feld konstant ist (dh nur eine bestimmte Anzahl von Beziehungstypen) können Sie eine CASE-Anweisung es so transponieren schreiben kann ...

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 

jedoch ein ziemlich krasser Nachteil ist, dass, wenn Sie neue Beziehungen hinzufügen, dann beginnen Sie doppelte Zeilen zu erhalten, damit diese nur verwendet werden sollten, wenn Sie strenge Version haben in Ihrem SP Steuerung oder ähnliche

EDIT Apologies, I die GROUP BY-Klausel verpasst aus :)

+0

Die Beziehungen sind konstant und ich habe Ihre Methode versucht, aber ich bekomme Null-Werte in abwechselnden Reihen. Zum Beispiel ist die Beziehung 2 in der Zeile 1 null und in der Zeile 2 ist die Beziehung 4 null und nicht der Name des Elterns. – user552311

+0

Die GROUP BY sollte das Problem beseitigen, tut mir leid, ich bin es gewohnt, diesen Ansatz mit Aggregaten zu verwenden und verpasste es, weil es keine gab! –

1

Gibt es eine maximale Anzahl von Eltern für ein Kind (d. H. Beziehungen)? Und gibt es eine pro Beziehung?

Wenn dies der Fall ist, können Sie dies mit einem PIVOT tun, um von Ihrem aktuellen Ausgang zum gewünschten Ausgang zu gelangen.

Allerdings, wenn es eine feste Anzahl von Rollen sind, könnten Sie auch beinhalten, dass in Ihrem schließt sich von Anfang an:

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 

usw.

+0

Dies ist der beste Weg, es zu tun. Vielen Dank! – user552311

Verwandte Themen