【问题标题】:How to call function in select statement and calculate total?如何在select语句中调用函数并计算总数?
【发布时间】:2021-07-07 22:01:24
【问题描述】:

我有如下表格:

Employees : EmployeeId, EmpName , DepartmentId

Transaction: TransactionId, EmployeeId

我有一个返回员工列表的查询:

select * from Employees e
inner join Department d on e.DepartmentId = d.Id
--some other joins
where d.DepartmentId in (@departmentIds)
--other filters

我有一个名为“GetEmployeeCommissionByTransactionId”的“标量”函数,它计算每笔交易的员工佣金并返回该特定交易的“佣金”。

现在我想对交易表进行左连接并在每笔交易上调用“GetEmployeeCommissionByTransactionId”并在最终结果中获得“总佣金”,如下所示:

最终结果集:

EmployeeId  EmpName   DepartmentId   Total Commission
1           John      100             1000
2           Frieda    200             2000

但我对调用该函数然后为每个员工传递多个交易 ID 并计算总佣金有点困惑。

有人可以帮我解决这个问题吗?

函数如下所示:

CREATE FUNCTION [dbo].[GetEmployeeCommissionByTransactionId]
(
    @transactionId INT
)
RETURNS Decimal(18,0)
AS
BEGIN
  DECLARE @Commission DECIMAL;
  -----Logic to calculate commission---------
  RETURN @Commission;
End

【问题讨论】:

  • 您的问题暗示您的标量函数需要一个表类型参数。如果是这样,那么您无法将数据集传递给它,除非您定义一个正确类型的变量,INSERT 将数据放入所述变量中,然后将其传递给您的函数。如果是这种情况,您应该真正做的是设计一个内联表值函数。
  • 您的函数代码定义、您尝试调用它以及一些示例数据以及预期结果都将有助于澄清您的问题。
  • RETURNS Decimal(18,0) - 那么这实际上是 bigint 吗?
  • (18,0) 表示小数点后 0 位。 declare @x decimal(18,0)=12345.6789; print @x = 12346
  • @ILoveStackoverflow 这是一个很大的主题,真的是你需要自学的,官方文档总是一个很好的起点,例如Inline Table Valued FunctionUsing Table Valued Parameters

标签: sql sql-server tsql


【解决方案1】:

要使用您创建的函数计算多笔交易的佣金,您必须 sum 所有相关交易的函数结果,然后对您的数据进行分组以获得所需的列。

select e.EmployeeId, e.EmpName, d.DepartmentId
    , sum(dbo.GetEmployeeCommissionByTransactionId(t.id)) Commission
from Employees e
inner join Department d on e.DepartmentId = d.Id
left join [Transaction] t on t.EmployeeId = e.Id
where d.DepartmentId in (@departmentIds)
group by e.EmployeeId, e.EmpName, d.DepartmentId;

然而,正如 cmets 中所指出的,一种更高效的方法是采用 EmployeeId 而不是 TransactionId 的内联表值函数。

【讨论】:

  • 赞成您为帮助我所做的努力。只是一件小事,我还有一个过滤器来搜索佣金,比如用户可以输入最小和最大佣金值,然后数据将被相应地过滤。这个过滤器将成为有子句的一部分吗?
【解决方案2】:

我不确定您是如何加入事务表的,但如何使用外部应用。

SELECT e.Id AS EmployeeId, e.EmpName, e.DepartmentId, tx.TotalCommission
FROM Employees e 
    INNER JOIN Department d ON e.DepartmentId = d.Id 
    OUTER APPLY (
        SELECT [dbo].[GetEmployeeCommissionByTransactionId](t.TransactionId) AS TotalComission 
        FROM Transactions t WHERE t.EmployeeId = e.Id) tx  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 1970-01-01
    相关资源
    最近更新 更多