2013-04-18 52 views
0

我在与下面的查询问题,在SQL Server的工作。使用聚集和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 

我的脚本是一个简单的列提取,当emp_id为null时,通过case语句创建一个唯一的键。我遇到的问题是,当这个人有多个分配时,将assign_perc与total_Salary相乘,并且当该销售人员仅列出一次时获得最高工资。例如 - 我的预计业绩:

enter image description here

约翰·史密斯是唯一被列具有一种分配的兼职工人只有一次,所以他assign_perc将小于1但我仍然需要最高的薪水,而不是总计(assign_perc * total_salary)。感谢您的帮助。

+1

您的结果与SQL不一致。对于约翰史密斯,薪水和总薪水有相同的价值,但薪水应根据您的查询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, 

这里是完整的查询

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 
012:在地方“雇员标识”的代滔天的CASE语句