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