SQL嵌套选择和别名

SQL嵌套选择和别名,sql,ms-access,select,alias,Sql,Ms Access,Select,Alias,形势 我有一个典型的MS Access数据库,其中包含有关公司、薪酬、员工和职位的信息。部分表格包括: tbl_报告(报告ID主键,报告年度) tbl_员工(员工ID主键) tbl_Pay(工资ID主键、工资、员工ID FK、报告ID FK) tbl_职位(职位ID主键、职位、员工ID FK、报告ID FK) 我有一个查询,用于选择每个职位和年份的薪资,以生成: qry_Salary_by_Position_Year: (This query is parameterised to acce

形势

我有一个典型的MS Access数据库,其中包含有关公司、薪酬、员工和职位的信息。部分表格包括:

  • tbl_报告(报告ID主键,报告年度)
  • tbl_员工(员工ID主键)
  • tbl_Pay(工资ID主键、工资、员工ID FK、报告ID FK)
  • tbl_职位(职位ID主键、职位、员工ID FK、报告ID FK)
  • 我有一个查询,用于选择每个职位和年份的薪资,以生成:

    qry_Salary_by_Position_Year:   (This query is parameterised to accept a 'Year').
    
    Year | Salary | Position
    ------------------------
    2014 |  100   |   CEO
    2013 |  200   |   CEO
    2014 |  300   |   CFO
    2014 |  200   |  Chairman
    2013 |  150   |   CEO
    
    etc.
    
    然后,我使用另一个查询来提取给定职位的最高x%工资:

    qry_Select_Top_25:
    
    SELECT TOP 25 PERCENT Salary, Year, Position
    FROM qry_Salary_by_Position_Year;
    
    它给出了类似于:

    Salary | Year | Position
    ------------------------
     100   | 2014 |  CEO
     100   | 2014 |  CFO
     200   | 2014 |  CFO
    
    问题

    我想要的是一个显示最大值(25%)、最大值(50%)、最大值(75%)、最大值(X%)的最终表格,按位置和年份分组,例如:

    Year | Position | 25th | 50th | 75th 
    -------------------------------------
    2013 |   CEO    |  10  |  30  |  75  
    2014 |   CEO    |  20  |  50  |  80  
    2014 |   CFO    |  15  |  30  |  90
    2014 | Chairman |  20  |  25  |  30
    
    我可以使用

    SELECT Year, Position, Max(qry50.Salary) AS 50_Percentile
    FROM (SELECT TOP 50 PERCENT qry_Salary_by_Position_Year.Salary, Year, Position 
    FROM qry_Salary_by_Position_Year)  AS qry50
    WHERE Position IN  (SELECT DISTINCT Position FROM qry_Salary_by_Position_Year) AND Year IN (SELECT DISTINCT Year FROM qry_Salary_by_Position_Year)
    GROUP BY Year, Position;
    
    但我无法理解如何使用正确的别名等构造查询,以便将其他百分比值作为其他列添加进来。有人有任何建议/意见/问题吗

    编辑

    我可能已经想出了一个解决方案,我现在正在检查:

    SELECT qry.Year, qry.Position, Max(qry25.Salary) AS 25_Percentile, Max(qry50.Salary) AS 50_Percentile, Max(qry75.Salary) AS 75_Percentile, Max(qry100.Salary) AS 100_Percentile
    FROM 
    ((((qry_Salary_by_Position_Year qry
    LEFT OUTER JOIN (SELECT TOP 50 PERCENT  Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry50 ON qry.Year = qry50.Year AND qry.Position = qry50.Position)
    LEFT OUTER JOIN (SELECT TOP 25 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry25 ON qry.Year = qry25.Year AND qry.Position = qry25.Position)
    LEFT OUTER JOIN (SELECT TOP 75 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry75 ON qry.Year = qry75.Year AND qry.Position = qry75.Position)
    LEFT OUTER JOIN (SELECT TOP 100 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry100 ON qry.Year = qry100.Year AND qry.Position = qry100.Position)
    GROUP BY qry.Year, qry.Position
    

    我想这就是我想要的:

    SELECT qry.Year, qry.Position, Max(qry25.Salary) AS 25_Percentile, Max(qry50.Salary) AS 50_Percentile, Max(qry75.Salary) AS 75_Percentile, Max(qry100.Salary) AS 100_Percentile
    FROM 
    ((((qry_Salary_by_Position_Year qry
    LEFT OUTER JOIN (SELECT TOP 50 PERCENT  Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry50 ON qry.Year = qry50.Year AND qry.Position = qry50.Position)
    LEFT OUTER JOIN (SELECT TOP 25 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry25 ON qry.Year = qry25.Year AND qry.Position = qry25.Position)
    LEFT OUTER JOIN (SELECT TOP 75 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry75 ON qry.Year = qry75.Year AND qry.Position = qry75.Position)
    LEFT OUTER JOIN (SELECT TOP 100 PERCENT Salary, Year, Position FROM qry_Salary_by_Position_Year) AS qry100 ON qry.Year = qry100.Year AND qry.Position = qry100.Position)
    GROUP BY qry.Year, qry.Position
    
    我在另一篇帖子中的回答引出了这个解决方案: