Есть ли способ выбрать имя из другой таблицы, если оно соответствует условию в случае - PullRequest
0 голосов
/ 11 ноября 2019

Я пытаюсь предоставить список всех навыков, к которым относится ТОЛЬКО 1 сотрудник, и если у них есть только 1 сотрудник, я хочу видеть там имя.

Я пытался использовать CASE дляскажем, что если количество умений в <= 1, то покажите имя сотрудника (расположенное в другой таблице с именем employeeee) </p>

SELECT es.skillId, COUNT(es.employeeId) 'Number of Skill Holders',
CASE WHEN COUNT(es.employeeId) <= 1 THEN (select e.firstName from Employee e )
ELSE 'No Skill shortage'
END AS 'Skill status'
FROM [dbo].[EmployeeSkill] es
JOIN Employee e ON e.id = es.employeeId
group by es.skillId

Однако я получаю эту ошибку:

Подзапросвернул более 1 значение. Это недопустимо, если подзапрос следует =,! =, <, <=,>,> = Или когда подзапрос используется в качестве выражения.

Ответы [ 3 ]

2 голосов
/ 11 ноября 2019

Вы уже объединяетесь с таблицей Employee, поэтому, если вы знаете, что существует только 1 запись (сотрудник) с этим конкретным навыком, вы можете сделать MAX(e.firstName), чтобы отобразить его имя, и удалить подзапрос.

SELECT 
    es.skillId, 
    COUNT(es.employeeId) 'Number of Skill Holders',
    CASE 
        WHEN COUNT(es.employeeId) <= 1 THEN MAX(e.firstName)
        ELSE 'No Skill shortage'
        END AS 'Skill status'
FROM 
    [dbo].[EmployeeSkill] es
    INNER JOIN Employee e ON e.id = es.employeeId
group by 
    es.skillId
2 голосов
/ 11 ноября 2019

соотносит ваш subquery с вашей основной employee таблицей.

SELECT es.skillId, COUNT(es.employeeId) 'Number of Skill Holders',
    CASE WHEN COUNT(es.employeeId) <= 1 THEN (select top 1 t1.firstName from Employee t1 where t1.employeeId = e.id)
    ELSE 'No Skill shortage'
    END AS 'Skill status'
FROM [dbo].[EmployeeSkill] es
JOIN Employee e ON e.id = es.employeeId
group by es.skillId
0 голосов
/ 11 ноября 2019

Вы можете попробовать запрос ниже. В этом списке будут перечислены навыки, для которых employeeCount равен 1. В нем также будет отображаться имя сотрудника.

SELECT e.firstname, 
       t.skillid 
FROM   employee e 
       JOIN (SELECT es.skillid, 
                    es.employeeid, 
                    Count(es.employeeid) 
                      OVER ( 
                        partition BY skillid) AS empcount 
             FROM   employeeskill es 
                    JOIN employee e 
                      ON es.employeeid = e.employeeid)t 
         ON e.employeeid = t.employeeid 
WHERE  empcount = 1 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...