根据数组公式填充NULL值

时间:2018-10-01 19:03:41

标签: sql sql-server

新用户,因此请提前为错误的格式表示歉意。

基本上,我想做的是能够填充staff_hours列,该列等于NULL且其中一个值为NOT NOT NULL。从屏幕快照中您可以看到,只有一个人为空缺的cl_hole_staffing_no配备人员,结果将有start_dt(随时间)和end_dt(随时间)与staff_hours。向16个人提供了一个班次,第15行中的人接受了这是怎么回事。

理想的输出将是staff_hours列,其中要填充一个最终完成这份空缺职位的人的时间,因此在此示例中为24.00。如何编写公式来做到这一点?我在想像Excel中的数组函数之类的东西,但是不确定如何在SQL中做到这一点。

SQL staff screenshot

2 个答案:

答案 0 :(得分:-1)

您的解释对您真正想要实现的目标有点困惑。但是,我认为您真正想要的只是填充 staff_hours 列,可以通过以下操作实现:

UPDATE
  your_table_name
SET
  staff_hours = 24
WHERE
  staff_hours is NULL;

编辑

我明白了。您要处理两个日期并提取它们之间的小时数。由于您位于sql-server中,因此实际上可以定义计算列,在其中您可以使用其他列中的值来计算所需的值。

您将需要再次创建表。 (下面的示例仅包含使其正常工作所需的属性)

CREATE TABLE your_table_name
(   id INT IDENTITY (1,1) NOT NULL  
  , staff_start_dt DATETIME
  , staff_end_dt DATETIME  
  , staff_hours AS DATEDIFF(hh, staff_start_dt , staff_end_dt)  
);

现在,每次在表上同时插入 staff_start_dt staff_end_dt 的记录时, staff_hours 列将自动计算小时数在两个日期之间。

答案 1 :(得分:-2)

[pre] 代码(vb):

A B C

1 10 X X 2 11年 3 12 Y Z 4 13乙 5 14乙 6 15 Z [/ pre]

假设Col A中的行命名为“ datarange”

您的条件在C1:C3

以下公式将返回数组{10,12,15}

= SMALL(COUNTIF(C1:C3,B1:B6)* datarange,ROW(INDEX(A:A,SUMPRODUCT(-(COUNTIF(C1:C3,B1:B6)= 0))+ 1): INDEX(A:A,ROWS(datarange))))

COUNTIF(C1:C3,B1:B6)*数据范围返回{10; 0; 12; 0; 0; 15}

段ROW(INDEX(....):INDEX(...))返回{4; 5; 6},表示非零值的数量。

然后,SMALL()函数返回第4个最小的值,第5个最小的值和第6个最小的值。

此方法的一个缺点是您会得到排序的子列表。也许这对您有用。