首页 > 解决方案 > 外连接在函数中发送案例列

问题描述

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

标签: sqlsql-serverfunctioncaseouter-join

解决方案


如果您对 有正常定义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;

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


推荐阅读