加入三个SQL Server CTE

问题描述 投票:0回答:1

我现在已经做了一段时间了,我想我已接近完成了。我已经设法找到一种使用CTE a和b以及内连接的方法来合并我的两个结果。我正在寻找一种可能的方法来将我的运行平均列(c)添加到此结果中。但我尝试的任何东西似乎都没有用。关于我应该如何做这个或更理想的方式处理这个的任何指导将不胜感激。

图片:

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
    )
sql-server tsql sql-server-2008 common-table-expression stored-functions
1个回答
0
投票

你有三个cte,如abc

  • 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 
© www.soinside.com 2019 - 2024. All rights reserved.