sql - 根据聚合值选择单个记录

标签 sql sql-server

假设我有下表

EmployeeID            Salary                      Date
-----------           ----------------            -----------
37                    45000.00                    2015-03-11 
102                   36500.00                    2015-03-11 
103                   43000.00                    2015-03-11 
104                   45000.00                    2015-03-11 
105                   40000.00                    2015-03-11 
37                    45000.00                    2015-04-11 
102                   36500.00                    2015-04-11 
103                   43000.00                    2015-04-11 
104                   45000.00                    2015-04-11 
105                   40000.00                    2015-04-11 

我想检索“Sum Of Salary”超过80000的记录,所以需要的输出是

EmployeeID            Salary                      Date
-----------           ----------------            -----------
37                    45000.00                    2015-03-11 
103                   43000.00                    2015-03-11 
104                   45000.00                    2015-03-11 
37                    45000.00                    2015-04-11 
103                   43000.00                    2015-04-11 
104                   45000.00                    2015-04-11 

我是通过以下方式实现的:

  1. 将聚合结果存储到表变量中。
  2. 原始表和表变量之间的内部连接

    DECLARE @tmpAggregatedSalaries TABLE
    (
        EmployeeID          INT,
        SumOfSalary         DECIMAL(18, 2)
    )
    
    INSERT INTO @tmpAggregatedSalaries
    SELECT sal.EmployeeID
        , SUM(sal.Salary) AS SumOfSalary
    FROM Salaries sal
    GROUP BY sal.EmployeeID
    
    SELECT sal.*
        FROM Salaries sal
        INNER JOIN @tmpAggregatedSalaries aggrSal ON sal.EmployeeID = aggrSal.EmployeeID
            AND aggrSal.SumOfSalary > 80000
    

据我所知,存储临时结果以进行处理优于内联查询,因此我选择了“表变量”。请给我建议更优化的版本。

最佳答案

一种选择是使用 GROUP BY 子查询来识别薪水总和大于 80000 的所有员工,以从您的表中过滤掉您不想看到的记录。

SELECT t1.EmployeeID,
       t1.Salary,
       t1.Date
FROM Salaries t1
INNER JOIN
(
    SELECT EmployeeID
    FROM Salaries
    GROUP BY EmployeeID
    HAVING SUM(Salary) > 80000
) t2
    ON t1.EmployeeID = t2.EmployeeID

关于sql - 根据聚合值选择单个记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39064145/

相关文章:

mysql - 有 > 运算符时,我需要什么样的索引?

SQL 优化 varchar(max) 列上的 ORDER BY 子句

SQL 将位列聚合为单个位结果

java - Java 和 SQL Server 中的精度噩梦

sql - 子查询返回超过 1 个值。当子查询后面有 =、!= 等时,这是不允许的

mysql - 连接将结果限制为连接表,无需子选择

mysql - 如何比较mysql中同一数据库中的两个表?

mysql - 使用位置关键字(例如 `First` 、 `Second` 等)重新排列 mysql 中的列

sql-server - 事务(进程 ID)在锁定资源上与另一个进程发生死锁,并已被选为死锁牺牲品。在 SQL Server 2014 中

sql - 使表中的列值具有相同数量的字符