Соединить 3 таблицы с графом - PullRequest
0 голосов
/ 30 июня 2018

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

CREATE TABLE Project ( ID INT IDENTITY(1,1), ProjectName VARCHAR(50), DueDate 
DATE)
CREATE TABLE Employee ( ID INT IDENTITY(1,1), EmployeeName VARCHAR(50) )
CREATE TABLE ProjectAssignment ( ID INT IDENTITY(1,1), ProjectID INT, 
EmployeeID INT)

INSERT INTO Project VALUES ('Alpha', '1/1/2040'), ('Bravo', '3/1/2030'), 
('Charlie', '2/1/2017'), ('Delta', '4/1/2017')
INSERT INTO Employee VALUES ('John'), ('Beth'), ('Tom'), ('Kim'), ('Jack')
INSERT INTO ProjectAssignment VALUES   (1, 1), (1, 2), (2, 2), (2, 3), (3, 
3), (3, 4), (1, 3)

--TABLE Project:
ID  ProjectName DueDate
1   Alpha   2040-01-01
2   Bravo   2030-03-01
3   Charlie 2017-02-01
4   Delta   2017-04-01

--TABLE Employee:
ID  EmployeeName 
1   John
2   Beth
3   Tom
4   Kim
5   Jack

--TABLE ProjectAssignment:
ID  ProjectID   EmployeeID
1   1   1
2   1   2
3   2   2
4   2   3
5   3   3
6   3   4
7   1   3

Вот мой неправильный запрос:

SELECT n.ProjectName, Count(t.ProjectID) as NumMembers
FROM Project p 
LEFT JOIN ProjectAssignment t ON p.EmployeeID = t.EmployeeID
LEFT JOIN employee e ON e.ProjectID = t.ProjectID
GROUP BY n.Project
ORDER BY n.Project

Желаемый результат:

| ProjectName | NumMembers  |
+-------------+-------------+
| Alpha       | 3           |
| Bravo       | 2           |
| Charlie     | 2           |
| Delta       | null        |

Ответы [ 4 ]

0 голосов
/ 30 июня 2018
SELECT n.ProjectName, Count(t.ProjectID) as NumMembers FROM Project n LEFT JOIN ProjectAssignment t ON n.id = t.ProjectID GROUP BY t.ProjectID ORDER BY n.ProjectName

выполнить этот запрос

0 голосов
/ 30 июня 2018

Мало вещей

СЛЕДУЮЩЕЕ ПРИСОЕДИНЕНИЕ к ProjectAssignment t ON p.EmployeeID = t.EmployeeID неправильно, как вы видите p.EmployeeID не существует в таблице Project

ваше присоединение к employee вообще не нужно

также, наконец, я не знаю, как называются ваши поля. вы публикуете Имя в примере данных, а имя_проекта используется в вашем запросе, а ddl (изменяется вместо вашего запроса на DDL)

SELECT p.ProjectName, Count(DISTINCT pa.EmployeeID) as NumMembers
FROM Project p 
LEFT JOIN ProjectAssignment pa ON p.ID   = pa.ProjectID   
GROUP BY p.ID, p.ProjectName 
ORDER BY p.ProjectName 

http://sqlfiddle.com/#!18/36df5/1

0 голосов
/ 30 июня 2018

Просто используйте это (кажется, что условия соединения смешаны):

SELECT p.ProjectName, Count(t.ProjectID) as NumMembers
FROM Project p 
LEFT JOIN ProjectAssignment t ON p.ID = t.ProjectID
LEFT JOIN employee e ON t.EmployeeID = e.ID
GROUP BY p.ProjectName
ORDER BY p.ProjectName;

ProjectName NumMembers
   Alpha    3
   Bravo    2
   Charlie  2
   Delta    0

Демонстрация SQL Fiddle

0 голосов
/ 30 июня 2018

Пожалуйста, попробуйте этот запрос Mysql. Это решит вашу проблему. Мы не требуем объединения сотрудников. Если вы не берете какие-либо данные из таблицы сотрудников, не добавляйте таблицу сотрудников в объединение.

  SELECT 
    p.name AS ProjectName,
    Count( t.employeeID ) AS NumMembers 
  FROM 
    Project p 
    LEFT JOIN ProjectAssignment t ON p.id = t.projectID
  GROUP BY 
    p.name

Выход:

Project name        NumMembers
Alpha                   3
Bravo                   2
Charlie                 2
Delta                   0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...