SQL Server: ошибка «подзапрос вернул более 1 значения» - PullRequest
0 голосов
/ 27 июня 2019

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

SELECT  b.brc_id AS 'Branch ID',
        s.stf_first_name AS 'Manager First Name',
        s.stf_last_name AS 'Manager Last Name',
        (SELECT COUNT (sa.stf_position)
         FROM STAFF_T sa, BRANCH_T ba
         WHERE (sa.stf_position = 'Supervisor')
         GROUP BY ba.brc_id, sa.stf_first_name, sa.stf_last_name) AS  
'Number of Supervisor',
        (SELECT COUNT (sb.stf_position)
         FROM STAFF_T sb, BRANCH_T bb
         WHERE (sb.stf_position = 'Staff') AND (sb.stf_gender = 'Male')
         GROUP BY bb.brc_id, sb.stf_first_name, sb.stf_last_name) AS 'Male 
  Staff',
        (SELECT COUNT (sc.stf_position)
         FROM STAFF_T sc, BRANCH_T bc
         WHERE (sc.stf_position = 'Staff') AND (sc.stf_gender = 'Female')
         GROUP BY bc.brc_id, sc.stf_first_name, sc.stf_last_name) AS 
 'Female Staff'
 FROM 
     BRANCH_T b, STAFF_T s
 WHERE 
     (b.brc_id = s.stf_brc_id) AND (b.brc_manager = s.stf_id)
 GROUP BY 
     b.brc_id, s.stf_first_name, s.stf_last_name   

В выводе должно отображаться общее количество руководителей, мужчин иженский персонал в каждом филиале компании.Но появляется следующее сообщение об ошибке:

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

1 Ответ

0 голосов
/ 27 июня 2019

Это потому, что ваш подзапрос выполняется в исходных таблицах, которые имеют более одного кортежа bc.brc_id, sc.stf_first_name, sc.stf_last_name. Если вы хотите рассчитывать на сгруппированные данные, используйте SUM CASE WHEN или SUM IIF следующим образом:

SELECT  b.brc_id AS 'Branch ID',
        s.stf_first_name AS 'Manager First Name',
        s.stf_last_name AS 'Manager Last Name',
        SUM(IIF(s.stf_position = 'Supervisor', 1, 0)) AS 
'Number of Supervisor',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Male'), 1, 0)) AS 'Male 
  Staff',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Female'), 1, 0)) AS 'Female Staff'
 FROM 
     BRANCH_T b, STAFF_T s
 WHERE 
     (b.brc_id = s.stf_brc_id) AND (b.brc_manager = s.stf_id)
 GROUP BY 
     b.brc_id, s.stf_first_name, s.stf_last_name   

И второе, условие о предложении where:

AND (b.brc_manager = s.stf_id)

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

SELECT  b.brc_id AS 'Branch ID',
        m.stf_first_name AS 'Manager First Name',
        m.stf_last_name AS 'Manager Last Name',
        SUM(IIF(s.stf_position = 'Supervisor', 1, 0)) AS 
'Number of Supervisor',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Male'), 1, 0)) AS 'Male 
  Staff',
        SUM(IIF((s.stf_position = 'Staff') AND (s.stf_gender = 'Female'), 1, 0)) AS 'Female Staff'
 FROM 
     BRANCH_T b
     INNER JOIN STAFF_T s ON b.brc_id = s.stf_brc_id
     LEFT JOIN STAFF_T m ON b.brc_manager = m.stf_id
 GROUP BY 
     b.brc_id, m.stf_first_name, m.stf_last_name   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...