2017-02-13 4 views
0

У меня возникла проблема с моей базой данных. Я воспроизвел его с помощью приключенческих работ 2014.Результат пустой таблицы

Я хочу показать все результаты, где BusinessEntityID отображается более одного раза. Поэтому, если пользователь был членом двух депараций, их идентификатор будет отображаться дважды

Но это то, что я получаю с приведенным ниже запросом. 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

Я бы ожидал, что он вернет первый снимок экрана, но я получу второй – 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

Im going Предположим, что ваш запрос работает нормально, и если вы не включите группу, вы принесете всех сотрудников. Так что вам нужно присоединиться со списком сотрудников с +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'. И почему вы не вычисляете «GROUP BY - HAVING» в cте вместо этого? –

+0

@JuanCarlosOropeza Это зверь запроса :-( –

+0

Почему вы думаете, что Im только написал дополнительный 'JOIN': P. Но если вы используете мой запрос в cte, конечный результат будет чистым –