gpt4 book ai didi

mysql - SUM 列值与 group by aggregate 处理空值

转载 作者:行者123 更新时间:2023-11-30 22:43:29 25 4
gpt4 key购买 nike

我有一张员工表。数据插入为(在 oracle 中):

ID  EMP_NAME    DEPT_NAME   EFFORTS ACTIVITY_DAY
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 30 13-May-15
633 ALEX XYZ 0 15-May-15

但我需要将一天的工作量设为 30,例如这里 30 已在 2015 年 5 月 13 日填写了两次,因为 ALEX 在那里有两个 dept_name。我需要像这样修改记录:

ID  EMP_NAME    DEPT_NAME   EFFORTS ACTIVITY_DAY
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 0 13-May-15
633 ALEX XYZ 0 15-May-15

最佳答案

根据您想要的输出,如果我理解正确的话,当给定的 EMP_NAME 存在不止一行时,您想将 EFFORTS 列更新为零ACTIVITY_DAY

您可以使用ROW_NUMBER() 分析函数对具有给定条件的行进行排名,然后更新排名 > 1 的行的工作量。

让我们看看:

设置

SQL> SELECT * FROM t;

ID EMP_ DEP EFFORTS ACTIVITY_
-------- ---- --- ---------- ---------
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 30 13-May-15
633 ALEX XYZ 0 15-May-15

SQL>

驱动查询

SQL> SELECT t.*,
2 row_number()
3 OVER(PARTITION BY emp_name, activity_day ORDER BY activity_day) rn
4 FROM t;

ID EMP_ DEP EFFORTS ACTIVITY_ RN
-------- ---- --- ---------- --------- ----------
633 ALEX XYZ 30 13-May-15 1
633 ALEX ABC 30 13-May-15 2
633 ALEX XYZ 30 14-May-15 1
633 ALEX XYZ 0 15-May-15 1

SQL>

更新表的MERGE语句

SQL> MERGE INTO t
2 USING(
3 SELECT t.*,
4 row_number()
5 OVER(PARTITION BY emp_name, activity_day ORDER BY activity_day) rn
6 FROM t
7 ) u
8 ON (t.ID = u.ID
9 AND t.emp_name = u.emp_name
10 AND t.dept_name = u.dept_name
11 AND t.activity_day = u.activity_day)
12 WHEN MATCHED THEN UPDATE SET efforts = 0
13 WHERE u.rn > 1;

1 row merged.

SQL>

让我们检查一下

SQL> SELECT * FROM t;

ID EMP_ DEP EFFORTS ACTIVITY_
-------- ---- --- ---------- ---------
633 ALEX XYZ 30 13-May-15
633 ALEX XYZ 30 14-May-15
633 ALEX ABC 0 13-May-15
633 ALEX XYZ 0 15-May-15

SQL>

因此,这给出了所需的输出。

关于mysql - SUM 列值与 group by aggregate 处理空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30388127/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com