Как мне написать подзапрос для объединения фамилии и имени, используя другую таблицу в базе данных в SQL Server? - PullRequest
0 голосов
/ 24 апреля 2019

Я использую 2 таблицы, Orders и Employees.Оба имеют идентификаторы сотрудников.Мне нужно получить общее количество заказов, выполненных каждым отдельным сотрудником.

Я хочу, чтобы мой результат был таким: полное имя, общее количество заказов.

Что я мог бы получить: идентификатор сотрудника, общее количество заказов.

Я не могу подключиться Order.EmployeeID с Employees.EmployeeID, даже при использовании CAST или CONVERT.

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

SELECT 
    [dbo].[Orders].EmployeeID AS Seller,
    COUNT(OrderID) AS Amount
FROM
    [dbo].[Orders]
JOIN 
    [dbo].[Employees] ON [dbo].[Employees].EmployeeID = [dbo].[Orders].EmployeeID
GROUP BY 
    [dbo].[Orders].EmployeeID;

Я ожидаю следующий результат:

|Name        |TotalOrders|
+------------+-----------+
|Johnny Bravo| 120       |

Однако текущий результат:

|ID|TotalOrders|
+--+-----------+
|1 |120        |

Ответы [ 2 ]

2 голосов
/ 24 апреля 2019

Просто объедините их, например,

SELECT 
    o.EmployeeID AS Seller,
    CONCAT(e.FirstName + ' ', e.LastName) AS FullName, 
    COUNT(o.OrderID) AS Amount
FROM
    [dbo].[Orders] o
JOIN 
    [dbo].[Employees] e ON o.EmployeeID = e.EmployeeID
GROUP BY 
    o.EmployeeID, e.FirstName, e.LastName

Вы также можете сделать это

(e.FirstName + ' ' + e.LastName) as FullName

Но остерегайтесь этого, когда один из столбцов равен NULL, тогда результат также будет NULL

Тогда вам придется сделать это

(isnull(e.FirstName, '') + ' ' + isnull(e.LastName, '')) as FullName

Таким образом, функция CONCAT проще, она преобразует значения NULL в пустые строки для вас.

См. Также Документация

EDIT
Как отмечает Шон Ланге, лучше сделать

Concat(e.FirstName + ' ', e.LastName) as FullName,

вместо

Concat(e.FirstName, ' ', e.LastName) as FullName,

Потому что таким образом у вас не будет начальных пробелов, когда имя пустое

0 голосов
/ 24 апреля 2019
SELECT [dbo].[Orders].EmployeeID AS Seller,Concat ([Orders].FirstName,[Orders].Lastname) fullname,
       COUNT(OrderID) AS Amount
FROM [dbo].[Orders]
     JOIN [dbo].[Employees] ON [dbo].[Employees].EmployeeID = [dbo].[Orders].EmployeeID
GROUP BY [dbo].[Orders].EmployeeID,[Orders].FirstName,[Orders].Lastname;
...