垂直计算列

时间:2016-04-29 08:13:16

标签: sql sql-server

我们正在尝试分析我们的员工每小时工作多长时间以进行趋势和预测。

我想通过垂直计算列中的所有值来做人数。

这是SQL中每小时格式的输出
(我已经圈出了我想总结的价值观)
another version of bcrypt.h
http://i.stack.imgur.com/dJbWi.png

只要该值大于0,我想将其计为1,因为这是按小时计算的人数。

这是我生成输出的查询的一部分。

    SELECT 

--b.*,
b.EMPLOYEENAME,
B.DEPARTMENT,

CONVERT(datetime, LEFT(b.SHIFTA_start,17),103) AS SHIFTA_start,
CONVERT(datetime, LEFT(b.ShiftA_End,17),103) as ShiftA_End,
b.StartTime_HOUR,
b.StartTime_min,
b.EndTime_HOUR,
b.EndTime_min,


CASE WHEN b.[0H_START] < b.[0H_END] THEN  b.[0H_START] ELSE b.[0H_END] END AS [0],
CASE WHEN b.[1H_START] < b.[1H_END] THEN  b.[1H_START] ELSE b.[1H_END] END AS [1]


from
(
/*Step 2  - calculating minutes from starttime and endtime */

select a.*,

/**Calculating the number of minutes worked from start_time MIN **/
CASE WHEN a.StartTime_HOUR = 0 and a.[0] = 1  AND a.StartTime_min !=0 THEN cast(cast((60-a.StartTime_min) as decimal(10,2))/60 as decimal(10,2)) ELSE a.[0] END AS [0H_START],
CASE WHEN a.StartTime_HOUR = 1 and a.[1] = 1  AND a.StartTime_min !=0 THEN cast(cast((60-a.StartTime_min) as decimal(10,2))/60 as decimal(10,2)) ELSE a.[1] END AS [1H_START],


/**Calculating the number of minutes worked from END_time MIN **/
CASE WHEN a.EndTime_HOUR = 0 and a.[0] = 1  AND a.EndTime_min !=0 THEN cast(cast((a.EndTime_min) as decimal(10,2))/60 as decimal(10,2)) ELSE a.[0] END AS [0H_END],
CASE WHEN a.EndTime_HOUR = 1 and a.[1] = 1  AND a.EndTime_min !=0 THEN cast(cast((a.EndTime_min) as decimal(10,2))/60 as decimal(10,2)) ELSE a.[1] END AS [1H_END]
from

(--Step 1:
/*to determine 1 or 0 using the start and end hour 
If time falls in the respective hour = 1
if time doesnt fall in the respective hours = 0*/
SELECT 

[EMPLOYEENAME], 
[DEPARTMENT],
[SHIFTA_start],
CASE WHEN  [SHIFTA_START] !='' OR SHIFTA_START != NULL THEN CONVERT(datetime, LEFT([SHIFTA_START],17),103) ELSE NULL END AS SHIFTA_START_con,
CASE WHEN  [SHIFTA_START] !='' OR SHIFTA_START != NULL THEN DATEPART(hh,CONVERT(datetime, LEFT([SHIFTA_START],17),103))  ELSE NULL END AS StartTime_HOUR,
CASE WHEN  [SHIFTA_START] !='' OR SHIFTA_START != NULL THEN DATEPART(mi,CONVERT(datetime, LEFT([SHIFTA_START],17),103))  ELSE NULL END AS StartTime_min,

[SHIFTA_end],
CASE WHEN [SHIFTA_END] !='' OR SHIFTA_end != NULL THEN CONVERT(datetime, LEFT([SHIFTA_END],17),103) ELSE NULL END AS SHIFTA_END_con,
CASE WHEN [SHIFTA_END] !='' OR SHIFTA_end != NULL THEN DATEPART(hh,CONVERT(datetime, LEFT([SHIFTA_end],17),103))  ELSE NULL END AS EndTime_HOUR,
CASE WHEN [SHIFTA_END] !='' OR SHIFTA_end != NULL THEN DATEPART(mi,CONVERT(datetime, LEFT([SHIFTA_end],17),103))  ELSE NULL END AS EndTime_min,


CASE WHEN [SHIFTA_START] !='' AND 0 BETWEEN DATEPART(hh,CONVERT(datetime, LEFT([SHIFTA_START],17),103)) AND DATEPART (hh,CONVERT(datetime, LEFT([SHIFTA_end],17),103)) THEN 1  ELSE 0 END AS [0],
CASE WHEN [SHIFTA_START] !='' AND 1 BETWEEN DATEPART(hh,CONVERT(datetime, LEFT([SHIFTA_START],17),103)) AND DATEPART (hh,CONVERT(datetime, LEFT([SHIFTA_end],17),103)) THEN 1  ELSE 0 END AS [1]

from [DatabaseTable].[dbo].[ATTENDANCE]

where ShiftA_Start != '' and ShiftA_End !='' and shiftA_start != shiftA_End

)a

)b

请帮助,谢谢你!

1 个答案:

答案 0 :(得分:0)

如果您想计算此列中所有值的数量,您可以简单地使用:

SELECT COUNT(T.[22]) FROM Table AS T
WHERE T.[22] > 0