Функция CTE с оператором вставки - PullRequest
0 голосов
/ 05 мая 2020

У меня есть 2 запроса, и мне нужно объединить их в один запрос с оператором вставки.

Это мой первый запрос, в котором уже есть оператор вставки:

with q as (
      select s.department
           ,s.months
           ,s.years     
           ,count(case when s.sum_lost_time >='10:00:00' then NAME end) as RTOTALLOSTTIME
           ,count(case when s.sum_ot >='20' then NAME end) as ROT
     from (select MONTH(STATUSIN)  as [months]
                   ,YEAR(STATUSIN) as [years]
                   ,NIP
                   ,NAME
                   ,DEPARTMENT         
                   ,convert(varchar,dateadd(second,sum(datediff(second,'00:00:00',cast(TOTALLT as time))),0),108) as sum_lost_time
                   ,SUM(CAST(OT AS FLOAT)) as sum_ot
              from SUMMARYDATA b 
          group by MONTH(STATUSIN)
                   ,YEAR(STATUSIN)
                   ,NIP
                   ,NAME
                   ,DEPARTMENT
            )s
    group by  s.department
             ,s.months
             ,s.years  
     )
INSERT INTO REPORTDATA(DEPARTMENT,MONTHS,YEARS,RTOTALLOSTTIME,ROT)
SELECT DEPARTMENT,MONTHS,YEARS,RTOTALLOSTTIME,ROT
FROM q

Это результат первого запроса в таблице REPORTDATA:

enter image description here

And this is my second query.

WITH cte AS 
(
    SELECT DISTINCT [NAME], DEPARTMENT, MONTH(STATUSIN) [MONTH], YEAR(STATUSIN) [YEAR], 
        SUM(CASE WHEN LATECOME = '00:00:00' THEN 0 ELSE 1 END) OVER(PARTITION BY [NAME], DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN)) Total
        ,SUM(CASE WHEN EARLYLEAVE = '00:00:00' THEN 0 ELSE 1 END) OVER(PARTITION BY [NAME], DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN)) TotalEarlyLeave 
    FROM SUMMARYDATA
)

SELECT SUM(CASE WHEN TOTAL > 2 THEN 1 ELSE 0 END) LATECOME, 
SUM(CASE WHEN TotalEarlyLeave > 1 THEN 1 ELSE 0 END) EARLYLEAVE
FROM cte
GROUP BY DEPARTMENT, [MONTH], [YEAR] 

And this is the result from second query:

Подсчитайте сводные записи за месяц с условным SQL, и это образец для второго запроса: Подсчет записей в месяц с условием в SQL Сервер

1 Ответ

1 голос
/ 05 мая 2020

Это просто, если вы объедините свои запросы как несколько CTE и, наконец, СОЕДИНИТЕ их.

Вот так:

;
with cte1 as (
      select s.department
           ,s.months
           ,s.years     
           ,count(case when s.sum_lost_time >='10:00:00' then NAME end) as RTOTALLOSTTIME
           ,count(case when s.sum_ot >='20' then NAME end) as ROT
     from (select MONTH(STATUSIN)  as [months]
                   ,YEAR(STATUSIN) as [years]
                   ,NIP
                   ,NAME
                   ,DEPARTMENT         
                   ,convert(varchar,dateadd(second,sum(datediff(second,'00:00:00',cast(TOTALLT as time))),0),108) as sum_lost_time
                   ,SUM(CAST(OT AS FLOAT)) as sum_ot
              from SUMMARYDATA b 
          group by MONTH(STATUSIN)
                   ,YEAR(STATUSIN)
                   ,NIP
                   ,NAME
                   ,DEPARTMENT
            )s
    group by  s.department
             ,s.months
             ,s.years  
     ),
cte2 as (
    SELECT DISTINCT [NAME], DEPARTMENT, MONTH(STATUSIN) [MONTH], YEAR(STATUSIN) [YEAR], 
        SUM(CASE WHEN LATECOME = '00:00:00' THEN 0 ELSE 1 END) OVER(PARTITION BY [NAME], DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN)) Total
        ,SUM(CASE WHEN EARLYLEAVE = '00:00:00' THEN 0 ELSE 1 END) OVER(PARTITION BY [NAME], DEPARTMENT, MONTH(STATUSIN), YEAR(STATUSIN)) TotalEarlyLeave 
    FROM SUMMARYDATA
    ),
cte3 as (
    SELECT DEPARTMENT, [MONTH], [YEAR], SUM(CASE WHEN TOTAL > 2 THEN 1 ELSE 0 END) LATECOME, 
    SUM(CASE WHEN TotalEarlyLeave > 1 THEN 1 ELSE 0 END) EARLYLEAVE
    FROM cte2
    GROUP BY DEPARTMENT, [MONTH], [YEAR] 
    )
INSERT INTO REPORTDATA (DEPARTMENT, MONTHS, YEARS, RTOTALLOSTTIME, ROT, RLATECOME, REARLYLEAVE)
SELECT cte1.DEPARTMENT, cte1.MONTHS, cte1.YEARS, cte1.RTOTALLOSTTIME, cte1.ROT,
       cte3.LATECOME, cte3.EARLYLEAVE  
FROM cte1
     LEFT JOIN cte3 ON cte3.DEPARTMENT = cte1.DEPARTMENT and cte3.[MONTH] = cte1.[MONTH] and cte3.[YEAR] = cte1.[YEAR]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...