【发布时间】:2019-08-28 08:39:16
【问题描述】:
我已经为此工作了一段时间,我想我快要完成了。我设法找到了一种使用 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
)
【问题讨论】:
-
@Larnu - 2008 年没有。
ROWS UNBOUNDED PRECEDING等是在 SQL Server 2012 中引入的 -
只是升级@MartinSmith 的众多原因之一。 (加上它即将完全用完支持的事实)。确实让我感到惊讶的是,有多少人仍在使用如此接近生命终结的东西。
标签: sql-server tsql sql-server-2008 common-table-expression stored-functions