2016-06-09 6 views
1

Verwenden von SqlServer 2014.Arbeiten an Adventureworks2014, nicht ordnungsgemäß beitreten

Unten ist mein guter und schlechter Code. Ich versuche, die HumanResources.Employee db abzufragen, und zwei Dinge damit, das letzte Bezahlupgrade in Bezahlen von der HumanResources.EmployeePayHistory in der Form von "neueste Datum", und die erste, mittlere und letzte Namen von die Person.Person-Datei.

Ich war in der Lage, die Mitarbeiterdaten abzufragen und die Namen erfolgreich aufzunehmen.

select b.*,(a.FirstName +' '+ isnull(a.MiddleName,'')+' '+a.LastName) as WHOLE_NAME 
from Person.Person a 
join HumanResources.Employee b 
on a.BusinessEntityID = b.BusinessEntityID 

konnte ich dann herausfinden, wie das richtige Datumsformat aus der Pay-History-Datei ...

Select Convert(VarChar(10),ModifiedDate,101) as Date 
From HumanResources.EmployeeDepartmentHistory 

Ich weiß zu bekommen, dass ich den MAX Datum für jedes Pay-Upgrade finden wie dieses:

Aber wenn ich versuche, drei Tabellen zu kombinieren, schmilzt mein Gehirn ziemlich und ich blase es weiter. Hier ist mein Chaos:

Select Convert(VarChar(10),c.ModifiedDate,101) as Date, b.*,(a.FirstName +' '+ isnull(a.MiddleName,'')+' '+a.LastName) as WHOLE_NAME 
From Person.Person a inner join 
HumanResources.Employee b on a.BusinessEntityID = b.BusinessEntityID 
inner join 
(Select BusinessEntityID, MAX(ModifiedDate) as MostRecent 
From HumanResources.EmployeePayHistory 
Group By BusinessEntityID) 
HumanResources.EmployeePayHistory c 
on c.businessEntityID = a.BusinessEntityID 

Können Sie mir helfen, diesen letzten Drei-Tabellen-Beitritt Versuch zu beheben? Vielen Dank.

Antwort

1
  • Ändern Sie diese Convert(VarChar(10),c.ModifiedDate,101) as Date dieser Convert(VarChar(10),c.MostRecent,101) as Date (da Sie benannt haben die Spalte, die Sie as MostRecent referenzieren)
  • ändern alias auf der abgeleiteten Join-Tabelle einfach c

Ganze query:

SELECT Convert(VarChar(10),c.MostRecent,101) as Date, 
     b.*, 
     (a.FirstName +' '+ isnull(a.MiddleName,'')+' '+a.LastName) as WHOLE_NAME 
FROM Person.Person a 
INNER JOIN HumanResources.Employee b on a.BusinessEntityID = b.BusinessEntityID 
INNER JOIN (SELECT BusinessEntityID, MAX(ModifiedDate) as MostRecent 
      FROM HumanResources.EmployeePayHistory 
      GROUP BY BusinessEntityID 
      ) c on c.businessEntityID = a.BusinessEntityID 
+0

Dank ein Haufen Aaron. Seltsam. Die zweite innere Verbindung mit der Max-Funktion erhält also die "c" -Aufgabe außerhalb der Klammer in der unteren Zeile. Ok, das sehe ich. Ich muss über die Tatsache nachdenken, dass Sie es auf neuestes geändert haben, da ich zuerst dachte, dass die Verwendung von MostRecent in dieser unteren Auswahlanweisung es nicht unbedingt deklariert. – hitbid

+0

@hitbid Kein Problem. Die Fachbegriffe für diesen 'JOIN' sind * geschachtelte Auswahl * und/oder * abgeleitete Tabelle *. Die wichtigste ist * abgeleitete Tabelle *, da Sie im Wesentlichen eine Tabelle für die äußere Abfrage erstellen, die referenziert werden soll. Daher werden alle Aliase, die Sie Spalten in Ihren abgeleiteten Tabellen angeben, als die tatsächlichen Spaltennamen in Ihrer äußeren Abfrage angesehen. –

+0

@hitbid Eine andere Möglichkeit wäre, eine temporäre Tabelle aus Ihrer abgeleiteten Tabelle zu erstellen und dann die gesamte Verknüpfung durch 'INNER JOIN # TEMP t auf t.businessEntityID = a.BusinessEntityID' zu ersetzen. Nun, jede Spalte, die Sie aus '# TEMP' auswählen wollten, würden Sie anhand ihres Spaltennamens in' # TEMP' auswählen. Es ist dieselbe Logik, die mit der abgeleiteten Tabelle passiert, Sie tun das alles in einer Abfrage. –

0

Ich denke, dass Sie dies überdenken. Sie können 2 einfache Joins und dann MAX() das letzte Gehaltserheben aus der Gehaltsverlaufstabelle durchführen. Ich glaube nicht, dass Sie die Mitarbeiterabschätzungs-Tabelle berühren müssen.

SELECT c.* 
    , a.businessentityid 
    , FirstName + ISNULL(middlename, '') + lastname AS fullname 
    , CONVERT(VARCHAR(10), MAX(b.ratechangedate), 101) AS last_pay_increase 
FROM person.person a 
INNER JOIN HumanResources.EmployeePayHistory b 
    ON b.BusinessEntityID = a.BusinessEntityID 
INNER JOIN HumanResources.Employee c 
    ON c.BusinessEntityID = a.BusinessEntityID 
GROUP BY c.BusinessEntityID 
    , c.NationalIDNumber 
    , c.LoginID 
    , c.OrganizationNode 
    , c.OrganizationLevel 
    , c.JobTitle 
    , c.BirthDate 
    , c.MaritalStatus 
    , c.Gender 
    , c.HireDate 
    , c.SalariedFlag 
    , c.VacationHours 
    , c.SickLeaveHours 
    , c.CurrentFlag 
    , c.rowguid 
    , c.ModifiedDate 
    , a.businessentityid 
    , FirstName + ISNULL(middlename, '') + lastname 
Verwandte Themen