2013-04-18 3 views
0

У меня возникают проблемы с нижеследующим запросом, работающим на SQL Server.Использование функций Aggregate и Max

SELECT 
     emp_id= CASE employee_id 
     WHEN '' 
      THEN RTRIM(last_name) + '_' + RTRIM(first_name) 
      + '_' + RTRIM(gender) + '_' 
      + RTRIM(race_ethnicity_code) + '_' 
      + RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_' 
      + RTRIM(assignment_code) 
      ELSE employee_id 
      END , 
     last_name, first_name, 
     assign_perc, 
      assignment_num, 
     CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2)) AS salary, 
     total_salary 
FROM employee 
ORDER BY last_name, first_name, district_name 

Мой скрипт - это простое извлечение столбцов, создающее уникальный ключ через оператор case для emp_id, когда его значение равно null. Проблема im заключается в том, чтобы умножить assign_perc на total_Salary, когда у этого человека есть несколько назначений и максимальная заработная плата, когда этот продавец указан только один раз. Например - мои ожидаемые результаты:

enter image description here

Джон Смит является лишь неполным рабочим, имеющими одно назначения быть перечислен только один раз, так что его assign_perc будет меньше, чем 1, но мне еще нужен максимальная зарплата, а не суммарная сумма (assign_perc * total_salary). Спасибо за помощь.

+1

Ваши результаты не согласуются с SQL. Для Джона Смита заработная плата и total_salary имеют одинаковую стоимость, однако зарплата должна составлять 0,75 * total_salary в соответствии с вашим запросом. –

+0

Полученные мной результаты - это то, что мне нужно. Мой запрос в настоящее время производит (.75 ​​* 10400) = 7800 - зарплата для Джона Смита. – Tone

+0

Решение будет действительно беспорядочным, поскольку у вас нет простого способа определить количество записей для конкретного сотрудника без конкретного employee_id. – PinnyM

ответ

1

Как уже отмечалось выше, это слишком грязно, поскольку вам необходимо использовать оператор CASE для определения виртуального employee_id. Это было бы много проще, если вы можете либо реорганизовать этот оператор CASE в udf, либо сохранить результат в таблице ради добра!

Чтобы уточнить, что это будет делать - вы хотите присоединиться к таблице employee таблицы, содержащей подсчеты для каждого сотрудника. Таблица подсчета будет выглядеть следующим образом:

SELECT employee_id, COUNT(*) AS employee_count 
FROM employee 
GROUP BY employee_id 

Объединение их вместе будет выглядеть следующим образом:

SELECT ... 
FROM employee 
JOIN (SELECT employee_id, COUNT(*) AS employee_count 
     FROM employee 
     GROUP BY employee_id) ec 
ON employee.employee_id = ec.employee_id 

Ваш расчетный зарплата будет теперь стала:

 CASE 
      WHEN ec.employee_count > 1 
       THEN CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2)) 
      ELSE total_salary 
     END AS salary, 

А вот полный запрос заменяя чудовищное заявление CASE вместо «employee_id»:

SELECT 
     CASE employee.employee_id 
     WHEN '' 
      THEN RTRIM(last_name) + '_' + RTRIM(first_name) 
      + '_' + RTRIM(gender) + '_' 
      + RTRIM(race_ethnicity_code) + '_' 
      + RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_' 
      + RTRIM(assignment_code) 
      ELSE employee.employee_id 
      END AS emp_id, 
     last_name, first_name, 
     assign_perc, 
     assignment_num, 
     CASE 
      WHEN ec.employee_count > 1 
       THEN CAST((total_salary)AS NUMERIC (18,2))* CAST((assign_perc) AS NUMERIC (18,2)) 
      ELSE total_salary 
     END AS salary, 
     total_salary 
FROM employee 
JOIN (SELECT CASE employee.employee_id 
     WHEN '' 
      THEN RTRIM(last_name) + '_' + RTRIM(first_name) 
      + '_' + RTRIM(gender) + '_' 
      + RTRIM(race_ethnicity_code) + '_' 
      + RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_' 
      + RTRIM(assignment_code) 
      ELSE employee.employee_id 
      END AS employee_id, COUNT(*) employee_count 
     FROM employee 
     GROUP BY CASE employee.employee_id 
     WHEN '' 
      THEN RTRIM(last_name) + '_' + RTRIM(first_name) 
      + '_' + RTRIM(gender) + '_' 
      + RTRIM(race_ethnicity_code) + '_' 
      + RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_' 
      + RTRIM(assignment_code) 
      ELSE employee.employee_id 
      END) ec 
    ON CASE employee.employee_id 
     WHEN '' 
      THEN RTRIM(last_name) + '_' + RTRIM(first_name) 
      + '_' + RTRIM(gender) + '_' 
      + RTRIM(race_ethnicity_code) + '_' 
      + RTRIM(high_degree_code) + '_' + RTRIM(position_code) + '_' 
      + RTRIM(assignment_code) 
      ELSE employee.employee_id 
      END = ec.employee_id 
ORDER BY last_name, first_name, district_name 
Смежные вопросы