如何在sql server中使用select * with group by subquery

问题描述

我有带有列的员工工资明细记录表

Id  Name        Year    Month   Salary
1   ABC         2021    Jan     50000
2   PQR         2021    Jan     40000
3   KLM         2021    Feb     45000
4   LMN         2021    Jan     55000
5   LMN         2022    Jan     20000
6   ABC         2022    Feb     25000
7   ABC         2022    Jan     2500
8   ABC         2022    Dec     60000
9   LMN         2022    Nov     70000

现在我想找出哪位员工加入时薪水大于100000,并显示员工所有数据

--找出目前工资超过100000的员工

select  name,sum(salary) as AnnualSalary from tblEmpsalary
group by Name
having sum(Salary)>100000 --this query works

--但是下面的查询不显示数据,(我想显示总工资超过100000的员工的所有数据)

SELECT id,name,Month,Year,SUM(Salary) AS TotalSales
FROM tblEmpsalary
GROUP BY name,Id,Salary
having SUM(Salary)>100000;

解决方法

 SELECT T.ID,T.Name,T.Year,T.Month,T.Salary
 FROM tblEmpsalary AS T
 JOIN
 (
   select  ID
   from tblEmpsalary
   group by ID
   having sum(Salary)>100000
 )AS X ON T.ID=X.ID
,

您可以为此使用窗口函数

SELECT
  id,name,Month,Year,TotalSales
FROM (
    SELECT *,SUM(Salary) OVER (PARTITION BY name) AS TotalSales
    FROM tblEmpsalary e
) e
WHERE e.TotalSales > 100000;
,

请尝试使用以下查询,其中一个查询用于分组,另一个查询用于获取员工详细信息:

SELECT TS.id,TS.name,TS.Month,TS.Salary,ATS.TotalSales FROM 
 (SELECT Month,SUM(Salary) AS TotalSales 
 FROM tblEmpsalary 
 GROUP BY Month,Salary
 HAVING SUM(Salary)>100000
 ) AS ATS
 LEFT OUTER JOIN tblEmpsalary TS on ATS.Month = TS.Month and ATS.Year = TS.Year
 ORDER BY TS.name,TS.Id,TS.Year,ATS.TotalSales