Подсчет итоговых записей за месяц с условным SQL - PullRequest
0 голосов
/ 11 марта 2020

У меня есть таблица, назовем их таблицей SUMMARYDATA

NIP  NAME   DEPARTMENT       STATUSIN           STATUSOUT             TOTALLOSTTIME 
------------------------------------------------------------------------------------------------
A1   ARIA   BB         2020-01-21 08:06:23  2020-01-21 11:58:36         00:23:15             
A2   CHLOE  BB         2020-01-21 07:34:27  2020-01-21 17:19:47         01:19:19               
A1   ARIA   BB         2020-01-22 08:00:00  2020-01-22 11:00:00         01:10:00
A2   CHLOE  BB         2020-01-22 08:05:00  2020-01-21 10:30:00         00:20:00
A11  BELLE  CC         2020-01-21 09:06:20  2020-01-21 13:58:31         00:25:10             
A21  ZIYA   CC         2020-01-21 08:34:27  2020-01-21 17:19:47         02:29:39               
A11  BELLE  CC         2020-01-22 07:06:00  2020-01-22 10:30:00         01:11:00
A21  ZIYA   CC         2020-01-22 09:05:00  2020-01-21 11:40:00         00:20:00

Мне нужно COUNT записей where sum(TOTALLOSTIME) group by nip,name,department > 02:00:00 в месяц и обновлять до таблицы REPORTDATA, это образец вывод, который я имел в виду:

DEPARTMENT     MONTH    YEAR   RTOTALLOSTTIME 
------------------------------------------------------------------------------------------------
  BB            01      2020           0              
  CC            01      2020           1

Столбец типа данных в TOTALLOSTTIME равен nvarchar

И это то, что я пробовал до сих пор:

select  MONTH(STATUSIN), YEAR(STATUSIN),NIP,NAME,DEPARTMENT,convert(varchar,dateadd(second,sum(datediff(second,'00:00:00',cast(TOTALLOSTTIME as time))),0),108) as sum_lost_time
from SUMMARYDATA b group by MONTH(STATUSIN), YEAR(STATUSIN),NIP,NAME,DEPARTMENT

Этот запрос просто показывает TOTALLOSTTIME на каждого сотрудника и в месяц.

Ответы [ 3 ]

1 голос
/ 11 марта 2020

использовать условный оператор CASE в SUM()

select  DEPARTMENT,
        MONTH(STATUSIN), 
        YEAR(STATUSIN),
        SUM (CASE WHEN TOTALLOSTTIME > '02:00:00') THEN 1 ELSE 0 END) AS RTOTALLOSTTIME 
from    SUMMARYDATA b 
group by DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN)
1 голос
/ 11 марта 2020

Попробуйте следующее

select x.department
       ,x.month
       ,x.year     
       ,count(case when x.sum_lost_time >'02:00:00' then NAME end) as RTOTALLOSTTIME 
 from (select MONTH(STATUSIN)  as [month]
               ,YEAR(STATUSIN) as [year]
               ,NIP
               ,NAME
               ,DEPARTMENT         
               ,convert(varchar,dateadd(second,sum(datediff(second,'00:00:00',cast(TOTALLOSTTIME as time))),0),108) as sum_lost_time
          from SUMMARYDATA b 
      group by MONTH(STATUSIN)
               ,YEAR(STATUSIN)
               ,NIP
               ,NAME
               ,DEPARTMENT
        )x
group by  x.department
         ,x.month
         ,x.year        
1 голос
/ 11 марта 2020

Вы в основном пропускаете предложение WHERE:

SELECT
    DEPARTMENT,
    MONTH(STATUSIN) AS MONTH,
    YEAR(STATUSIN) AS YEAR,
    SUM(DATEDIFF(second, '00:00:00', TOTALLOSTTIME)) AS sum_lost_time_in_sec
FROM SUMMARYDATA
WHERE
    TOTALLOSTIME > '02:00:00'
GROUP BY
    DEPARTMENT,
    MONTH(STATUSIN),
    YEAR(STATUSIN);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...