2016-07-20 6 views
1

Ich bin insgesamt Anfänger Zugang & SQL und ein neues Mitglied dieser großen Gemeinschaft. jetzt mit diesem Haftungsausschluss beiseite, ich brauche Hilfe mit dem Szenario unten :)SQl 3 Tabelle Vergleich

Ich habe derzeit drei Tabellen

1) Performance score (enthält Dateinummern, Namen und Partitur, eine Zeile pro Mitarbeiter)

2) Strengths (Dateinummer, Namen & Stärke, viele Zeilen pro Mitarbeiter je nach Anzahl der Stärken)

3) Development Needs (Dateinummer & Needs, viele Zeilen pro Mitarbeiter auf Anzahl der je nach Bedarf)

das Problem ist, dass, wenn immer mehr strengths als needs oder umgekehrt die Spalte mit weniger Informationen haben doppelte Werte sind zu kompensieren die Anzahl der Zeilen gemäß dieser screenshot.

gibt es eine Möglichkeit, um die Stärken & Spalten müssen von der Duplizierung basierend auf der Dateinummer zu verhindern, so dass die Person hätte 1 Stärke und zwei Bedürfnisse oder umgekehrt.

Dank im Voraus :)

+0

Bitte bearbeiten Sie Ihre Frage und fügen Sie die SQL Ihrer aktuellen Abfrage hinzu. – Andre

Antwort

0

Es gibt keine Duplikate, da Sie zwei unterschiedliche Werte im Feld „Not“ haben.

Aber man kann die "Need" Werte für jeden einzelnen Mitarbeiter verketten und Sie werden

so etwas wie dieses haben

"Verhandlungsgeschick und Presentation Skills"

in einer "need" row .

an dieser Stelle, ich denke, Sie können dies nicht in MS Access Query tun, wie Sie unbegrenzte Anzahl von "Need" Zeilen pro einzigartigen Mitarbeiter haben können. Sie müssen entweder VBA oder SQL Server verwenden, wenn Sie einen haben. SQL Server Funktion wie folgt sein sollte:

DECLARE @MyCursor CURSOR; 
DECLARE @EmployeeID INT; 
DECLARE @cnt AS INT = 1 
DECLARE @Res AS VARCHAR(4000) = '' 
DECLARE @Res2 AS VARCHAR(4000) = '' 

CREATE TABLE [ResultNeeds](Employeeid INT, Needs Varchar(Max)) 

BEGIN 
    SET @MyCursor = CURSOR FOR 
    SELECT [EmployeeID] FROM [Employees] 

    OPEN @MyCursor 
    FETCH NEXT FROM @MyCursor 
    INTO @EmployeeID 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     IF OBJECT_ID('tempdb..#tmpNeeds') IS NOT NULL DROP TABLE #tmpNeeds 
     SELECT * INTO #tmpNeeds FROM [Needs] WHERE [EmployeeID] = @EmployeeID 
     WHILE @cnt > 0 
     BEGIN 

      SELECT 
       TOP 1 @Res = [NeedName] 
      FROM 
       #tmpNeeds 

      SELECT @Res2 = @Res2 + @Res + '; ' 

      DELETE FROM #tmpNeeds WHERE [NeedName] = @Res 

      INSERT INTO [ResultNeeds] VALUES @EmployeeID, @Res2 

      SELECT @cnt = ISNULL(COUNT(*), 0) 
      FROM 
       #tmpNeeds 

     END 


     FETCH NEXT FROM @MyCursor 
     INTO @EmployeeID 
    END; 

    CLOSE @MyCursor ; 
    DEALLOCATE @MyCursor; 
END; 

HINWEIS: Dies ist die Probe Logik ist, habe ich es nicht für reale Daten getestet

+0

Danke Tedo, viel approved Ich werde es versuchen und lassen Sie es wissen, – AMohey

1

Wie @Tedo G. sagte - Es gibt keine Duplikate seit Sie haben zwei verschiedene Werte im Feld "Need".

Er gab Ihnen die SQL Server-Lösung, die Access-Lösung würde einige VBA erfordern.
Sie müssen die SQL im Code aktualisieren, damit alle Anforderungen für eine bestimmte Angestelltennummer (oder was auch immer Ihr Primärschlüssel ist) zurückgegeben werden.

Public Function JoinNeeds(EmployeeNumber As String) As Variant 

    Dim qdf As DAO.QueryDef 
' Dim prm As DAO.Parameter 
    Dim rst As DAO.Recordset 
    Dim ReturnValue As String 

    Set qdf = CurrentDb.CreateQueryDef("", "SELECT Need FROM Table3 WHERE [Employee Number]='" & EmployeeNumber & "'") 

    'If you get a "too few parameters" error - uncomment these lines and try again. 
' For Each prm In qdf.Parameters 
'  prm.Value = Eval(prm.Name) 
' Next prm 
    Set rst = qdf.OpenRecordset 

    With rst 
     If Not .BOF And Not .EOF Then 
      .MoveFirst 
      Do While Not .EOF 
       ReturnValue = ReturnValue & .Fields("Need") & "/" 
       .MoveNext 
      Loop 
      JoinNeeds = Mid(ReturnValue, 1, Len(ReturnValue) - 1) 
     Else 
      JoinNeeds = Null 
     End If 
    End With 

    rst.Close 
    Set rst = Nothing 
    Set qdf = Nothing 

End Function 

Sie können dann die Funktion in Ihrer Abfrage verwenden, um die Bedürfnisse miteinander zu verbinden:

SELECT DISTINCT [Employee Number], JoinNeeds([Employee Number]) AS Need 
FROM Table3; 

NB: einen fairen Betrag nach unten in Abhängigkeit von der Größe der Tabelle Diese Abfrage verlangsamen könnte - es hat um den Code für jeden Mitarbeiter auszuführen.