SUM列的值与聚合的值一起处理空值

时间:2015-05-22 03:58:49

标签: mysql sql oracle

我有桌子的员工。数据插入为(在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天,例如因为ALEX在那里有两个dept_name,所以这里有30个已经填充了两次,因为15月5日到15日。 我需要像这样修改记录:

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

1 个答案:

答案 0 :(得分:0)

根据您所需的输出,如果我理解正确,您希望在给定EFFORTS的{​​{1}}存在多行时将EMP_NAME列更新为零。

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

让我们看看:

<强>设置

ACTIVITY_DAY

驾驶查询

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>

更新表格的MERGE语句

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>

让我们检查

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>

所以,这给出了所需的输出。