2017-02-23 99 views
0

Привет всем Я хотел бы задать вам вопрос об использовании условия в функции подсчитывать с отчетливым в SQL сервереИспользуя условие с отчетливым в SQL сервере

COUNT(DISTINCT CASE E.SEX WHEN 'M' THEN 1 ELSE NULL END) AS M

но результат всегда 1 и 0 не засчитывается до

ниже запрос

SELECT E.DEPT,D.DESCRIPTION AS DEPARTMENT,JF.CODE,JF.DESCRIPTION AS POSITION, 
COUNT(DISTINCT E.EMPCODE) AS ACTUAL, 
COUNT(DISTINCT CASE E.SEX WHEN 'M' THEN 1 ELSE NULL END) AS M, 
COUNT(DISTINCT CASE E.SEX WHEN 'F' THEN 1 ELSE NULL END) AS F, 
SUM(CASE WHEN AT.LEAVEDESC = 'ABS' THEN 1 ELSE 0 END) AS AWP, 
SUM(CASE WHEN AT.LEAVEDESC = 'UPL' THEN 1 ELSE 0 END) AS UPL, 
SUM(CASE WHEN AT.LEAVEDESC='DO' THEN 1 ELSE 0 END) AS DO, 
SUM(CASE WHEN AT.LEAVEDESC='AL' THEN 1 ELSE 0 END) AS AL, 
SUM(CASE WHEN AT.LEAVEDESC='PH' THEN 1 ELSE 0 END) AS PH, 
SUM(CASE WHEN AT.LEAVEDESC='MTL' THEN 1 ELSE 0 END) AS MTL, 
SUM(CASE WHEN START1 <> '1900-01-01' AND END1 = '1900-01-01' THEN 1 ELSE 0 END) AS FCI, 
SUM(CASE WHEN START1 = '1900-01-01' AND END1 <> '1900-01-01' THEN 1 ELSE 0 END) AS FCO 
FROM HR_EMPMAST E LEFT JOIN HR_DEPARTMENT D ON E.DEPT = D.CODE 
LEFT JOIN HR_JOBFUNCTION JF ON E.JOBCODE = JF.CODE 
LEFT JOIN AT_EMPSCHEDULE AT ON E.EMPCODE = AT.EMPCODE 
WHERE (TERMINATESTATUS = '' OR (DATETERMINATE > N'2/23/2017 8:05:40 AM' AND STARTDATE <= N'2/23/2017 8:05:40 AM')) 
AND AT.TRANDATE BETWEEN '2017-02-01 00:00:00.000' AND '2017-02-28 00:00:00.000' 
GROUP BY E.DEPT,D.DESCRIPTION,JF.CODE,JF.DESCRIPTION 

! [результаты, которые показывают после выполнения сценария] [10]

+1

Что вы пытаетесь достичь Count (Distinct) Query? Для поля E.SEX существует только две возможности. Вот почему он возвращает 1 или 0 –

+0

Потому что, когда я присоединяюсь к AT_EMPSCHEDULE, у него есть 28 записей для каждого сотрудника (база в день в месяце в этом месяце Feb = 28), но я бы хотел сосчитать наемный рабочий. – Kosal

+0

@ Kosal, тогда вы должны считать 'DISTINCT e.empcode' вместо 1 или 0 – NickyvV

ответ

0

Чтобы получить правильный счет Male или Female, вам нужно заменить 1 EmpCode, потому что вы используете разные. Надеюсь, поможет.

COUNT(DISTINCT CASE E.SEX WHEN 'M' THEN E.EMPCODE ELSE NULL END) AS M 
COUNT(DISTINCT CASE E.SEX WHEN 'F' THEN E.EMPCODE ELSE NULL END) AS F