2017-01-12 2 views
0

В моем запросе, я использую OUTER APPLY, чтобы получить количество сотрудников в различных сценариях, какВнешняя ссылка Колонка в агрегатной функции креста применить

  1. Количество сотрудников Зарегистрирован в каждый день периода
  2. Номер персонала Уволился в каждый день периода
  3. Количество сотрудников оставляют на каждый день периода ... и т.д.

Ожидаемый результат (From:2017-01-10 to 2017-01-12)

CDATE  TOTAL_COUNT JOIN_COUNT RESIGNED _COUNT ... 
2017-01-10 1204  10   2 
2017-01-11 1212  5   1 
2017-01-12 1216  3   0 

Ниже мой запрос

DECLARE @P_FROM_DATE DATE = '2017-01-01', --From 1st Jan 
     @P_TO_DATE  DATE = '2017-01-10' --to 10th jan 

;WITH CTE_DATE 
AS 
( 
    SELECT @P_FROM_DATE AS CDATE 
    UNION ALL 
    SELECT DATEADD(DAY,1,CDATE) 
    FROM CTE_DATE 
    WHERE DATEADD(DAY,1,CDATE) <= @P_TO_DATE 
) 
SELECT [CDATE] 
     ,[TOTAL_COUNT] 
     ,[JOIN_COUNT] 
FROM CTE_DATE 
OUTER APPLY (
     SELECT COUNT(CASE WHEN [EMP_DOJ] = [CDATE] THEN 1 ELSE NULL END) AS [JOIN_COUNT] 
       ,COUNT(*) AS [TOTAL_COUNT] 
       ,.... 
       ,... 
     FROM [EMPLOYEE_TABLE] 
     ) AS D 

Но при выполнении моего запроса, получить ошибку ниже.

Msg 8124, уровень 16, состояние 1, строка 18 Несколько столбцов указаны в агрегированный выражение, содержащее внешнюю ссылку. Если агрегированное выражение содержит внешнюю ссылку, то внешняя ссылка должна быть единственным столбцом, на который ссылается выражение.

Здесь столбец [JOIN_COUNT] производит ошибку, без этой колонки запрос работает. Но у меня есть еще колонки в ожидании, чтобы добавить как [JOIN_COUNT] (например, Resigned_Count, ... и т.д.)

+0

Это в одной из частей SQL, которую вы нам не показываете? Части? – Cato

+0

, похоже, связано с этим http://sqlmag.com/blog/aggregates-outer-reference - их SQL также выглядел разумным - вы могли бы выполнять каждый сотрудник как отдельный раздел оператора WITH, а затем SELECT большой запрос из них в конце? – Cato

+0

@Cato, если я удаляю 'COUNT (CASE WHEN [EMP_DOJ] = [CDATE] THEN 1 ELSE NULL END) AS [JOIN_COUNT]', я получу запрос с ожидаемым выходом. Но JOIN_COUNT только ошибка (но у меня больше столбцов, ожидающих, как этот JOIN_COUNT, как RESIGN_COUNT, JUNIOR_JOIN_COUNT '... –

ответ

1

Вам не нужно outer apply для достижения этой цели, просто присоединиться к CTE_DATE Valus к столу сотрудника и использовать sum(case when <Conditions met> then 1 else 0 end) с group by в CDate

select d.CDate 
     ,sum(case when e.Emp_DoJ <= d.CDate 
        and e.EmployeeResignDate > d.CDate 
       then 1 
       else 0 
       end) as Total_Count 

     ,sum(case when e.Emp_DoJ = d.CDate 
       then 1 
       else 0 
       end) as Join_Count 

     ,sum(case when e.EmployeeResignDate = d.CDate 
       then 1 
       else 0 
       end) as Resign_Count 
from CTE_DATE d 
    left join Employee_Table e 
     on(d.CDate between e.Emp_DoJ and e.EmployeeResignDate) 
group by d.CDate 
order by d.CDate 
Смежные вопросы