2013-04-18 87 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語句