【问题标题】:group by + case statmentgroup by + case 语句
【发布时间】:2017-03-14 09:03:12
【问题描述】:

我想用case 加上group by 语句更新我的表。

我有包含salary 列的玩家表,每一行都有group_name

我想更新所有薪水高于平均组薪的球员。

首先我尝试列出姓名、球员薪水和球队平均薪水。我对此有疑问,我很乐意寻求帮助。

select  first_name,
        last_name,
        group_name,
        salary,
        (
          select round(avg(salary),2) as salary
          from players
          group by group_name
        )
from players

感谢您的帮助!!!

【问题讨论】:

  • 对这个场景使用内连接
  • 添加一些示例表数据和预期结果 - 以及格式化文本。
  • 你会用什么来更新这些行的值?
  • 你到底想在那里做什么?另外:您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql group-by case


【解决方案1】:

我仍然不知道您使用的是哪个 DBMS。因此我只能猜测。以下是更新命令 sql服务器:

update p set salary=avgsal+100 -- enter your formula here
from players p inner join
   (  select group_name gname,round(avg(salary),2) as avgsal
      from players
      group by group_name
    ) grped on gname=group_name
where salary>avgsal;

对于 MySql:

update players inner join
   (  select group_name gname,round(avg(salary),2) as avgsal
      from players
      group by group_name
    ) grped on gname=group_name
set salary=avgsal+100 -- enter your formula here!
where salary>avgsal;

在上述命令中,我将相关球员的当前工资替换为该组的平均工资+100。这当然是你应该输入自己的公式的地方!

【讨论】:

    【解决方案2】:

    在 JOIN 语句中使用 GROUP BY 子句:

    SELECT  first_name,last_name,group_name,salary
    FROM players
    JOIN 
    (
      SELECT ROUND(AVG(salary),2) as salary , group_name
      FROM PLAYERS
      GROUP BY group_name
    ) A ON A.group_name = players.group_name
    

    【讨论】:

      【解决方案3】:

      此 sql 将找到相应的玩家并使用该组的平均工资更新他的工资:-

      MERGE INTO MyTable MyTable
      USING
      (
          SELECT a.player,
                 a.[group],
                 a.sal,
                 b.sal2
          FROM MyTable a
               INNER JOIN
          (
              SELECT [group],
                     AVG(Sal) sal2
              FROM MyTable
              GROUP BY [group]
          ) b ON a.[group] = b.[group]
                 AND a.sal > b.sal2
      ) YY
      ON YY.player = MyTable.player
         AND YY.[group] = MyTable.[group]
          WHEN MATCHED
          THEN UPDATE SET
                          MyTable.sal = yy.sal2;
      

      【讨论】:

        【解决方案4】:

        试试这个@Amit Ben Zur

        SELECT Ord.first_name, Ord.last_name,Ord.group_name,
        (SELECT round(avg(salary),2)
         FROM Players AS OrdDet
         WHERE Ord.group_name = OrdDet.group_name) AS MaxUnitPrice
        FROM Players AS Ord
        

        【讨论】:

          猜你喜欢
          • 2013-11-19
          • 2020-10-26
          • 1970-01-01
          • 2020-04-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-03
          • 2022-01-15
          • 1970-01-01
          相关资源
          最近更新 更多