【发布时间】:2016-08-16 12:35:15
【问题描述】:
这可能是微不足道的,但我只是在学习 CTE(感谢这里的帮助)。
我有一个用于确定总数的程序。
第一部分是总计是其级别以下位置的总和。因此,我需要一种方法来检索记录,该方法 (1) 确定记录的级别(层次结构)并且 (2) 返回所有记录及其以下的记录。有人问并回答了here。
现在想从上面的答案中获取 CTE 表,并在我的程序的第二部分使用它(获取总数)
CREATE PROCEDURE [dbo].[GetProgramTotals]
@programId nvarchar(10) = null,
@owner int = null,
@totalAmount money OUT,
@usedAmount money OUT,
@remainingAmount money OUT
AS
BEGIN
WITH rCTE AS
(
SELECT
*, 0 AS Level
FROM Forecasting.dbo.Addressbook
WHERE Addressbook = @owner
UNION ALL
SELECT
t.*, r.Level + 1 AS Level
FROM Addressbook t
INNER JOIN rCTE r ON t.ParentAddressbook = r.Addressbook
)
Select @totalAmount = (Select Sum(Amount) from dbo.Budget where
(@programId IS NULL or (ProgramId = @programId)) and (@owner IS NULL or (BudgetOwner in (SELECT Addressbook from rCTE))))
Select @usedAmount = (Select Sum(SubTotal) from dbo.OrderLine where
(@programId IS NULL or (ProgramId = @programId) and (@owner IS NULL) or (Budget in (SELECT Addressbook from rCTE))))
if (@totalAmount is null)
set @totalAmount = 0
if (@usedAmount is null)
set @usedAmount = 0
Set @remainingAmount = (@totalAmount - @usedAmount)
END
此过程的想法是根据用户在层次结构中的位置动态计算单个(或所有)程序。
因此,区域经理总数将是所有地区和地区代表的总和。
更新:我根据下面的 squillman(谢谢)评论更新了这个。
现在我有一个不同的问题。当我执行 proc - 我得到“无效的对象名称 rCTE”。
【问题讨论】:
-
这能回答你的问题吗? Use one CTE many times
标签: sql-server stored-procedures parameters common-table-expression