基于sql中列值的最高工资

nszi6y05  于 2021-08-09  发布在  Java
关注(0)|答案(4)|浏览(282)

我的sql表中有下面的数据,我需要在其中找到我的最高工资,但这里的问题是,如果我的大学名称是c1,那么我需要考虑salary\u college1列,如果college c2,那么我需要从salary\u college2获取工资。

college  name     salary_college1   salary_college2
    c1       n1       5000               6000
    c1       n1       5000               6000
    c1       n1       5000               6000
    c1       n1       5000               6000
    c2       n2       9000               6000
    c2       n2       12000              4000

预期结果:

college  name     salary_college1   salary_college2
    c1       n1       5000               6000
    c2       n2       9000               6000

另外,如果有任何相同的组合重复,那么我只需要采取一个记录,我使用的大学和名称的条件组。有什么办法吗?

select * from(
    select college, name, dense_rank() 
    over(order by salary_college1 desc)r from tablename) 
    where r=1

但它给了我最高工资的基础上工资大学1我想考虑这些栏目的基础上大学栏目的价值可以有人请指导我该怎么做。

9fkzdhlc

9fkzdhlc1#

select college
       , name
       , salary_college1
       , salary_college2
from (SELECT distinct TN.college
             , TN.name
             , rank() over (partition by college order by (case when college  = 'c1' 
                                                         then salary_college1 
                                                         else salary_college2 
                                                         end) desc
               ) "rn"
             , salary_college1
             , salary_college2
      FROM tablename TN)
where "rn" = 1
order by college;

这是一个甲骨文的演示

select T1.college
       , T1.name
       , T1.salary_college1
       , T1.salary_college2
from (SELECT distinct TN.college
             , TN.name
             , rank() over (partition by college order by (case when college  = 'c1' 
                                                         then salary_college1 
                                                         else salary_college2 
                                                         end) desc
               ) rn
             , salary_college1
             , salary_college2
      FROM tablename TN) T1
where T1.rn = 1
order by T1.college;

下面是mysql的一个演示

m1m5dgzv

m1m5dgzv2#

你要找的是结构的情况。
case-when允许在查询中基本上有if/else子句。例如:

select CASE WHEN name is null THEN 'noName' ELSE 'hasName' END as caseField
from someTable

对你来说?
你想看看学校是什么。。。然后在when/else中使用不同的列。
另外,值得一提的是。。。你的table设计看起来很可疑。我是说,如果一张唱片的“大学”值是“c1”。。。为什么会有大学二年级的薪水?如果您将数据库规范化为以下内容,则可以完全消除问题:

college | name | salary
34gzjxbg

34gzjxbg3#

我认为这应该管用:

SELECT name, MAX(IF(college = 'c1', salary_college1, salary_college2)) salary 
FROM `tablename` 
GROUP BY name

如果表不保存冗余(或无用的)数据,查询将更容易。你为什么要为一所不相关的大学存钱?这将包含所有必要的数据:

college  name     salary
c1       n1       5000               
c1       n1       5000               
c1       n1       5000               
c1       n1       5000               
c2       n2       6000
c2       n2       4000

如果您需要其他工资,可以将其另存为新行。那是几年前的事吗?为什么同一个名字和同一所大学有不同的薪水?

byqmnocz

byqmnocz4#

SELECT `college`, `name`, MAX(`salary_college1`), `salary_college2` FROM `college` WHERE `college` = 'c1' GROUP BY `college`, `name`
UNION
SELECT `college`, `name`, `salary_college1`, MAX(`salary_college2`) FROM `college` WHERE `college` = 'c2' GROUP BY `college`, `name`

这可能是你想要的。虽然它不会提供您所写的预期结果。
这就是我得到的:
大学名称max( salary_college1 )大学工资2
c1 n1 5000 6000
c2 n2 5000 6000

相关问题