外连接在功能中发送案例栏

时间:2018-10-08 18:44:18

标签: sql sql-server function case outer-join

我在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

1 个答案:

答案 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;

但是,您的定义取决于函数的结果。因此,您想做的事没有明确说明。你不能做你想做的。这没有道理。