新用户,因此请提前为错误的格式表示歉意。
基本上,我想做的是能够填充staff_hours
列,该列等于NULL且其中一个值为NOT NOT NULL。从屏幕快照中您可以看到,只有一个人为空缺的cl_hole_staffing_no
配备人员,结果将有start_dt
(随时间)和end_dt
(随时间)与staff_hours
。向16个人提供了一个班次,第15行中的人接受了这是怎么回事。
理想的输出将是staff_hours
列,其中要填充一个最终完成这份空缺职位的人的时间,因此在此示例中为24.00。如何编写公式来做到这一点?我在想像Excel中的数组函数之类的东西,但是不确定如何在SQL中做到这一点。
答案 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):
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个最小的值。
此方法的一个缺点是您会得到排序的子列表。也许这对您有用。