我在SQL Server中有此查询
SELECT
t.acc_no,
t.[group],
t.maxgroup, t.amount,
t1.assigned,
taken = CASE
WHEN t1.assigned = 0 THEN NULL
ELSE t.amount
END,
[left] = CASE
WHEN t1.assigned = 0 THEN NULL
ELSE (t.maxgroup - t1.assigned)
END
FROM
Testtable t
OUTER APPLY
TestApply1(t.acc_no, t.[group], [left]) t1
,并且我尝试在函数中发送该列,但是出现错误消息,提示无效名称[left],我需要一种以某种方式在函数中发送该派生列的方法。我该怎么做。
ALTER FUNCTION TestApply1
(@accountNo INT, @group VARCHAR(30), @left INT)
RETURNS TABLE
AS
RETURN
(SELECT
assigned = SUM(CASE
WHEN t1.amount > t1.maxgroup THEN t1.maxgroup
ELSE t1.Amount
END)
FROM
Testtable t1
WHERE
t1.acc_no = @accountNo AND t1.[group] <= @group)
GO
答案 0 :(得分:1)
如果您对left
有一个普通的定义,则只需使用两个级别的apply
:
SELECT t.acc_no, t.[group], t.maxgroup, t.amount, t1.assigned,
taken = (CASE WHEN t1.assigned = 0 THEN NULL ELSE t.amount END),
v.[left]
FROM Testtable t CROSS APPLY
(VALUES (CASE WHEN t1.assigned = 0 THEN NULL
ELSE t.maxgroup - t1.assigned
END)
) v([left]) OUTER APPLY -- awful name for a column
TestApply1(t.acc_no, t.[group], v.[left]) t1;
但是,您的定义取决于函数的结果。因此,您想做的事没有明确说明。你不能做你想做的。这没有道理。