2016-08-01 2 views
0

У меня есть ниже запрос в моей программе SQLподсчет в случае заявления SQL

SELECT 
    m.managerid, 
    CASE 
     WHEN (ISNULL(COUNT(t.employeeid), 0) = 0) THEN 'No Manager' 
     ELSE COUNT(m.managerid) 
    END 
FROM employee t 
LEFT JOIN employenrol m 
    ON t.employeeid = m.employeeid 
GROUP BY t.employeeid 

if count(t.employeeid)= 0 мне нужно для отображения нет менеджера еще фактический отсчет.

Ошибка преобразования при преобразовании значения varchar 'No Manager' в тип данных int. Предупреждение: значение Null исключается агрегатом или другой операцией SET.

Как это исправить?

+0

ваш запрос не дает хорошее представление о вашей структуре данных .. каждый раз угадываю ответьте здесь, потому что вы считаете employeeid от сотрудника, который является вашей основной таблицей в вашем запросе, который не должен логически иметь нулевой employeeid. – JamieD77

ответ

2

От MSDN

типов данных else_result_expression и любого result_expression должен быть одинаковым или должна быть неявным преобразованием.

Вам нужно сделать явное преобразование в else части, так как первый then оператор возвращает VARCHAR, которые не могут быть преобразованы в INT.

SELECT t.employeeid, 
     CASE 
     WHEN Count(m.employeeid) = 0 THEN 'No Manager' 
     ELSE Cast(Count(m.employeeid) AS VARCHAR(50)) 
     END 
FROM employee t 
     LEFT JOIN employenrol m 
       ON t.employeeid = m.employeeid 
GROUP BY t.employeeid 

Также Count агрегат возвращается 0, когда у вас есть NULL. Нет необходимости использовать ISNULL функцию

+0

Я удивлен, что это даже скомпилировано – JamieD77

+0

@ JamieD77 - Да, не проверял имена псевдонимов и столбцов , –

0

Как об этом

Select m.managerid, 
    Case When count(t.employeeid) =0 Then 'No Manager' Else count(m.managerid) end 
From 
    employee t Left Join employenrol m On t.employeeid=m.employeeid 
Group By t.employeeid 
0

Я думаю, что это то, что Вы желаете сделать ..

SELECT t.employeeid, 
     CASE WHEN COUNT(m.managerid) = 0 THEN 'No Manager' 
      ELSE CAST(COUNT(m.managerid) AS VARCHAR(10)) 
     END 
FROM employee t 
     LEFT JOIN employenrol m ON t.employeeid = m.employeeid 
GROUP BY t.employeeid 

не знаю, почему вы выбрали бы m.managerid и количество t.employeeid, который дал бы ошибку, так как вы только группировка по t.employeeid

это может даже работать лучше для вас

SELECT t.employeeid, 
     CASE WHEN m.managercount = '0' THEN 'No Manager' 
      ELSE m.managercount 
     END 
FROM @employee t 
     OUTER APPLY (SELECT CAST(COUNT(managerid) AS VARCHAR(10)) managercount 
        FROM @employenrol m 
        WHERE t.employeeid = m.employeeid 
        ) m 
+0

Ваш второй запрос не даст тот же результат, что и ожидаемый OP, если таблица employee имеет дубликат 'employeeid', если в случае –

+0

@Prdp это правда .. им придется использовать разные, что, вероятно, снизит производительность в соответствии с первым запросом – JamieD77

Смежные вопросы