2017-02-13 13 views
0

私のデータベースに問題があります。私は冒険作品2014を使ってそれを複製しました。空白表結果

私は、BusinessEntityIDが複数回表示されているすべての結果を表示したいと思います。ユーザーが2つの部門のメンバーになっている場合、IDは2回表示されます

しかし、これは私が以下のクエリで得るものです。 enter image description here

SELECT Person.FirstName, 
     Person.LastName, 
     HumanResources.Department.Name AS CurrentDepartment, 
     StartDate, 
     EndDate 
FROM AdventureWorks2014.Person.Person 
JOIN HumanResources.EmployeeDepartmentHistory 
    ON HumanResources.EmployeeDepartmentHistory.BusinessEntityID = Person.BusinessEntityID 
JOIN HumanResources.Department 
    ON EmployeeDepartmentHistory.DepartmentID = HumanResources.Department.DepartmentID 
GROUP BY Person.BusinessEntityID, 
     HumanResources.Department.DepartmentID, 
     Person.FirstName, 
     Person.LastName, 
     HumanResources.Department.Name, 
     StartDate, 
     EndDate 
HAVING COUNT(Person.BusinessEntityID) > 1 
ORDER BY Person.LastName, StartDate 

私は結果(テーブル全体を)返されたのですか持っを削除します。だから私は問題がどこにあるのか/解決する方法を知っていると思う。

+2

あなたのサンプルの入力データを貼り付けてください。それは本当にすべての人が簡単に質問を理解するのに役立ちます。 – Tajinder

+0

そのグルーピングとそのデータに基づいて、クエリが返すものは何でしょうか? – HoneyBadger

+0

最初のスクリーンショットを返すことが期待されますが、2番目のスクリーンショットが返されます – Phil3992

答えて

0

と従業員のリストに参加する必要がある、私はあなたが本当に欲しいと思うことは、例えば、EmployeeDepartmentHistoryで複数のレコードを持つ人々であります

SELECT BusinessEntityID 
FROM HumanResources.EmployeeDepartmentHistory 
GROUP BY BusinessEntityID 
HAVING COUNT(*) > 1 

私はあなたの現在のクエリにこれを統合するための最も効率的な方法はEXISTSを使用していると思う:

SELECT p.FirstName, 
     p.LastName, 
     d.Name AS CurrentDepartment, 
     edh.StartDate, 
     edh.EndDate 
FROM Person.Person AS p 
     JOIN HumanResources.EmployeeDepartmentHistory AS edh 
      ON edh.BusinessEntityID = p.BusinessEntityID 
     JOIN HumanResources.Department AS d 
      ON d.DepartmentID = edh.DepartmentID 
WHERE EXISTS 
     ( SELECT 1 
      FROM HumanResources.EmployeeDepartmentHistory AS edh2 
      WHERE edh2.BusinessEntityID = p.BusinessEntityID 
      HAVING COUNT(*) > 1 
     ) 
ORDER BY p.LastName, StartDate 
+0

これは完璧に働いた。大きな助けのために他の答えを投票する – Phil3992

1

あなたのクエリは正常に動作すると仮定し、グループを含めないとすべての従業員を連れてきます。だから、あなたは1部門あなたは別にグループ化を行う必要があり

JOIN (SELECT P.BusinessEntityID --, COUNT(EDH.DepartmentID) for debug 
     FROM AdventureWorks2014.Person.Person P 
     JOIN HumanResources.EmployeeDepartmentHistory EDH 
     ON P.BusinessEntityID = EDH.BusinessEntityID 
     GROUP BY P.BusinessEntityID 
     HAVING COUNT(EDH.DepartmentID) > 1 
    ) as list_of_employees_with_two_or_more 
ON AdventureWorks2014.Person.Person.BusinessEntityID = 
    list_of_employees_with_two_or_more.BusinessEntityID 
1
WITH cte AS (
    SELECT Person.FirstName AS FirstName, 
      Person.LastName AS LastName, 
      Person.BusinessEntityID AS BusinessEntityID 
    FROM AdventureWorks2014.Person.Person 
    INNER JOIN HumanResources.EmployeeDepartmentHistory 
     ON HumanResources.EmployeeDepartmentHistory.BusinessEntityID = Person.BusinessEntityID 
    INNER JOIN HumanResources.Department 
     ON EmployeeDepartmentHistory.DepartmentID = HumanResources.Department.DepartmentID 
    GROUP BY Person.FirstName, 
      Person.LastName, 
      Person.BusinessEntityID 
    HAVING COUNT(*) > 1 
) 

SELECT Person.FirstName, 
     Person.LastName, 
     HumanResources.Department.Name AS CurrentDepartment, 
     StartDate, 
     EndDate 
FROM AdventureWorks2014.Person.Person 
INNER JOIN HumanResources.EmployeeDepartmentHistory 
    ON HumanResources.EmployeeDepartmentHistory.BusinessEntityID = Person.BusinessEntityID 
INNER JOIN HumanResources.Department 
    ON EmployeeDepartmentHistory.DepartmentID = HumanResources.Department.DepartmentID 
INNER JOIN cte t 
    ON Person.FirstName = t.FirstName AND 
     Person.LastName = t.LastName AND 
     Person.BusinessEntityID = t.BusinessEntityID 
+0

'BusinessEntityID'を使用して、同じ' FirstName、LastName'を持つ複数の従業員を持つことができます。なぜ、cteの 'GROUP BY - HAVING'を計算しないのですか? –

+0

@JuanCarlosOropezaこれはクエリの獣です:-( –

+0

なぜあなたはImが余分な 'JOIN'を書いたと思いますか:P。しかし、あなたが私のクエリをcteで使うと、最終結果はより洗練されたものになります –

関連する問題