Присоединяйтесь к трем SQL Server CTE - PullRequest
0 голосов
/ 06 апреля 2019

Я немного поработал над этим и думаю, что близок к завершению.Мне удалось найти способ, используя CTE a и b и внутреннее соединение, объединить два моих результата.Я ищу возможный способ добавить свой столбец скользящего среднего (с) к этому результату.Но ничего, что я пытаюсь, кажется, не работает.Будем благодарны за любые рекомендации о том, как мне поступить, или как сделать это более идеальным способом.

Изображение:

enter image description here

ALTER FUNCTION [dbo].[fn_rptAppointmentsBreakdown2]
    (@startDate DATETIME, 
     @endDate DATETIME) 
RETURNS TABLE 
AS
    RETURN 
        (WITH a AS
         (
             SELECT 
                 calendar_date,
                 SUM(cIsFS + cIsGB + cIsCH+ cIsGC + cIsWM + cIsTC + cIsAR + cIsPP + cIsC3 + cIsPW) AS 'TotalBookedPRU', 
                 SUM(cShowedUp * cIsFS) + SUM(cShowedUp * cIsCH) +
                     SUM(cShowedUp * cIsPW) AS Showed,
                 NULL AS 'Total Booked',
                 SUM(cIsNoShow * cIsC3) + SUM(cIsNoShow * cIsPW) AS 'No Shows/ Rebooked'
             FROM 
                 reports.dbo.vw_Appointments a
             WHERE
                 cAppointmentType = 'Recalls' AND
                 CONVERT(DATETIME, CONVERT(VARCHAR(8), calendar_date, 112)) BETWEEN @startDate AND @endDate 
             GROUP BY 
                 calendar_date
         ),
         b AS
         (
             SELECT 
                 calendar_date,
                 NULL AS 'Total Booked pru',    
                 NULL AS Showed,
                 SUM(cIsFS + cIsGB + cIsCH+ cIsGC + cIsWM + cIsTC + cIsAR + cIsPP + cIsC3 + cIsPW) AS 'TotalBooked',    
                 NULL AS 'No Shows/ Rebooked'
             FROM 
                 reports.dbo.vw_Appointments a
             WHERE
                 CONVERT(DATETIME, CONVERT(VARCHAR(8), calendar_date, 112)) BETWEEN @startDate AND @endDate 
             GROUP BY 
                 calendar_date
        ),
        c AS 
        (
             SELECT 
                 a.*, a2.Running_Average AS runningaverage
             FROM
                 a 
             OUTER APPLY
                 (SELECT AVG(showed) AS Running_Average
                  FROM a a2
                  WHERE a2.calendar_date <= a.calendar_date) a2
        )
        SELECT 
            a.calendar_date,
            a.TotalBookedPRU,
            a.Showed,
            b.TotalBooked
        FROM 
            a 
        INNER JOIN 
            b ON a.calendar_date = b.calendar_date
    )

1 Ответ

0 голосов
/ 06 апреля 2019

У вас есть три cte, такие как a, b и c.

  • cte c не используется в вашем вставленном коде функции. Поэтому лучше удалить неиспользуемый код, чтобы сделать его более понятным и понятным
  • как внизу SELECT вы выбираете только четыре поля, например calendar_date, TotalBookedPRU, Showed, TotalBooked, поэтому мы можем выбрать только те поля, которые находятся в SELECT statement
  • добавлен столбец, который рассчитывает время RunningTime

    ALTER FUNCTION [dbo].[fn_rptAppointmentsBreakdown2](@startDate datetime
    , @endDate datetime) RETURNS TABLE AS
    RETURNS TABLE 
    AS
    RETURN
    (
    with a as (
       SELECT 
       calendar_date,
       SUM(cIsFS + cIsGB + cIsCH+ cIsGC + cIsWM + cIsTC + cIsAR + cIsPP + cIsC3 + cIsPW) 
           AS 'TotalBookedPRU',     
       Null AS 'Total Booked'   
       FROM reports.dbo.vw_Appointments ACTION
       WHERE
       cAppointmentType = 'Recalls' AND
       CONVERT(datetime, CONVERT(varchar(8),calendar_date,112)) 
           BETWEEN @startDate AND @endDate    
       GROUP BY 
       calendar_date
       ),
    b as (
        SELECT 
        calendar_date,
        null AS 'Total Booked pru', 
        null AS Showed,
        SUM(cIsFS + cIsGB + cIsCH+ cIsGC + cIsWM + cIsTC + cIsAR + cIsPP + cIsC3 
            + cIsPW) AS 'TotalBooked'   
        FROM reports.dbo.vw_Appointments a
        WHERE   CONVERT(datetime, CONVERT(varchar(8),calendar_date,112)) 
            BETWEEN @startDate AND @endDate    
        GROUP BY 
        calendar_date
    )
    
    declare @start datetime = getutcdate();  
    
    SELECT 
    a.calendar_date,
    a.TotalBookedPRU,
    a.Showed,
    b.TotalBooked
    , DATEDIFF(ms, @start, getutcdate()) RunningTime
    FROM a Inner join b ON a.calendar_date = b.calendar_date
    )
    

Кроме того, если вы хотите узнать, сколько раз необходимо выполнить ваш запрос и подсчитать количество операций ввода / вывода / чтения с жесткого диска, вы можете использовать:

SET STATISTICS TIME ON
SET STATISTICS IO ON 
GO
SELECT * FROM fn_rptAppointmentsBreakdown2(/*your parameters here*/)
SET STATISTICS TIME OFF
SET STATISTICS IO OFF 
...