【问题标题】:SQL Query that returns data based on age range and根据年龄范围返回数据的 SQL 查询和
【发布时间】:2015-11-02 20:53:18
【问题描述】:

我有一个包含一些数据的员工表,如下图所示,我想查询它以查找每个年龄范围内员工的平均工资和百分比。我使用了以下查询,但我不知道如何包含平均和百分比结果。请帮忙。

SELECT emp.agerange as [age Range], count(emp.agerange) as [Number of employee on this age range]
FROM (
  SELECT CASE  
    WHEN age >60  THEN '60 And Up'
    WHEN age >=41 and age <=60 THEN '41-60'
    WHEN age >=21 and age <=40 THEN '21-40'
    WHEN age <=20 THEN '20 And Below' END as agerange
  from kin.dbo.Employee) emp
  group by emp.agerange 

【问题讨论】:

    标签: sql sql-server range aggregate-functions


    【解决方案1】:

    您可以使用 cte 创建您的年龄组,加入任何其他包含您想要使用的信息的表格,例如 LoanBalance 或 Salary。

    WITH emp as (
          SELECT CASE  
            WHEN age >60  THEN '60 And Up'
            WHEN age >=41 and age <=60 THEN '41-60'
            WHEN age >=21 and age <=40 THEN '21-40'
            WHEN age <=20 THEN '20 And Below' END as agerange
          ,l.LoanBalance -- might not be the field you are looking for
          from kin.dbo.Employee
          left join Loan l
          on ??????) -- You decide the join condition between these two tables
    
    SELECT emp.agerange as [age Range]
    ,count(*) as [Number of employee on this age range]
    ,count(*) / (SELECT COUNT(*) FROM emp) as pctAgeRange
    ,(SELECT SUM(LoanBalance) / COUNT(*) FROM emp) as avgLoanBalance
    FROM emp
      group by emp.agerange 
    

    【讨论】:

    • 我只有一张表(Employee),不使用left join可以得到结果吗?
    • @Jhon.M 是的,只要确保在emp中包含任何要计算的字段即可
    【解决方案2】:

    这行得通吗?我将您的 AgeRange 函数放入 CTE。

    WITH cteRange AS (
        SELECT ID,
            CASE  
                WHEN age > 60  THEN '60 And Up'
                WHEN age >= 41 and age <=60 THEN '41-60'
                WHEN age >= 21 and age <=40 THEN '21-40'
                WHEN age <= 20 THEN '20 And Below'
            END AS 'ageRange'
        FROM kin.dbo.Employee
    )
    SELECT cteRange.ageRange,
        COUNT(*) AS 'Number of Employees',
        SUM(emp.Salary) AS 'Total Salary',
        AVG(emp.Salary) AS 'Average Salary',
        ROUND(COUNT(*)/(SELECT COUNT(*) FROM kin.dbo.Employee)*100,2) AS '% Employees in age Range'
    FROM kin.dbo.Employee AS emp
        INNER JOIN cteRange ON emp.ID = cteRange.ID
    GROUP BY cteRange.ageRange
    

    【讨论】:

    • 平均工资只针对年龄段,不必计算整个数据平均值
    • 正好在年龄范围内,COUNT(*)在底部按年龄范围分组。 COUNT(*) 只是选择组中每一行的简写。
    【解决方案3】:

    不需要连接,平均值是一个简单的 SQL AVG,并且可以使用 GROUP SUM 轻松计算百分比:

    SELECT emp.agerange as [age Range],
       count(*) as [Number of employee on this age range],
       SUM(Salary) AS "Total Salary",  
       AVG(Salary) AS "Average Salary",
       100 * COUNT(*) / SUM(COUNT(*)) OVER () AS "% of employees in this range"
    FROM
     (
      SELECT Salary,
        CASE  
          WHEN age >60  THEN '60 And Up'
          WHEN age >=41 and age <=60 THEN '41-60'
          WHEN age >=21 and age <=40 THEN '21-40'
          WHEN age <=20 THEN '20 And Below' 
        END as agerange
      from kin.dbo.Employee
     ) emp
    group by emp.agerange 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-17
      • 2022-01-23
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      相关资源
      最近更新 更多