【问题标题】:Using Aggregate and Max functions使用 Aggregate 和 Max 函数
【发布时间】:2013-04-11 19:03:21
【问题描述】:

我在使用 SQL Server 时遇到以下查询问题。

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 为空时,通过 case 语句为它创建一个唯一键。我遇到的问题是,当该人有多项任务时,将 assign_perc 与 total_Salary 相乘,而当该销售人员仅列出一次时,则获得最高薪水。例如 - 我的预期结果:

John Smith 只是一名兼职员工,他的一项任务只列出一次,因此他的 assign_perc 将小于 1,但我仍然需要最高工资而不是总工资 (assign_perc*total_salary)。感谢您的帮助。

【问题讨论】:

  • 你的结果与SQL不一致。对于 John Smith,salary 和 total_salary 具有相同的值,但根据您的查询,salary 应为 0.75 * total_salary。
  • 我提供的结果就是我需要的。我的查询目前正在产生 (.75*10400) = 7800 - John Smith 的薪水。
  • 解决方案将非常混乱,因为您没有一种简单的方法来识别没有具体employee_id 的特定员工的条目数。
  • 明白了...我尝试了多个子查询,在连接 emp_id 后加入同一个表,但我得到了重复的记录。

标签: sql sql-server-2008 case aggregate-functions


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-01-26
    • 2020-07-23
    • 1970-01-01
    • 1970-01-01
    • 2019-08-15
    • 2010-12-10
    • 2021-12-01
    • 2019-02-01
    • 2023-03-05
    相关资源
    最近更新 更多