1

我坚持使用 T-SQL 查询。我认为这是基本的。但我想不通。有人可以很好地阐明它吗?提前致谢!

这是我的问题。我想编写一个查询来执行以下任务:

原始数据:

Department Type Salary Age 
1 1 1000 30 
1 2 1500 31 
1 3 2000 25 
2 1 250 35 
2 2 50 20 
2 3 300 35

理想情况下,我想要一张桌子,其中包含以下信息:

Department Type Salary Age
1 3 2000 25
1 2 1500 31
1 1 1000 30
2 3 300 35
2 1 250 35

选择基于每个部门的比较。我比较了每个部门内每种类型的薪水。并选择同一部门的薪水大于或等于类型1的人。然后在每个部门中,记录按薪水的降序排列。

这是我的错误代码。

SELECT Department, Type, Salary, Age
FROM Database.dbo.Table1
WHERE Salary >=  
(
SELECT Salary
FROM Database.dbo.Table1
WHERE Type = 1
GROUP BY Department
)
GROUP BY Department

我希望插图清楚。如果不是,请随时告诉我。我可以解释更多。

再次感谢!

4

2 回答 2

1

这里没有什么太棘手的 - 只是一个自连接回到同一个表来识别Type = 1薪水,然后是一个相当正常的ORDER BY子句:

样本数据:

declare @t table (Department int,[Type] int, Salary int, Age int)
insert into @t(Department,[Type], Salary, Age ) values
(1 ,1 ,1000 ,30    ),
(1 ,2 ,1500 ,31    ),
(1 ,3 ,2000 ,25    ),
(2 ,1 ,250 ,35     ),
(2 ,2 ,50 ,20      ),
(2 ,3 ,300 ,35     )

询问:

select
    t1.*
from
    @t t1
        inner join
    @t t2
        on
            t1.Department = t2.Department and
            t1.Salary >= t2.Salary and
            t2.[Type] = 1
order by t1.Department, t1.Salary desc

您尝试使用GROUP BY是错误的,因为1对最终输出顺序GROUP BY没有任何影响。


1作为分组处理方式的副作用,输出可能会按照对您有用的顺序进行排序 - 但这只是副作用,不能保证。保证排序的唯一方法是使用ORDER BY.

于 2013-08-06T13:48:01.863 回答
0
select * from T as t1
where 
type=1
or
Exists(select 1 from t where t.[Department]=t1.[Department]
                             and
                             t.type=1
                             and 
                             salary<t1.salary 
                             )

order by [Department],salary DESC

SQLFiddle 演示

于 2013-08-06T13:58:58.120 回答