通过检查表变量

时间:2017-10-17 20:59:04

标签: sql sql-server sql-server-2008

我有一份报告,我正在处理,报告中传递了一些参数。其中一个是由逗号操作的一串UserIds。这些被拆分并发送到表变量中。在我的查询方面,我需要能够对值进行求和。在这些Sums的一些中,我需要通过大小写将该值添加到总和中,而在另一种情况下不添加它。代码看起来像这样......

    SELECT 
        TrnId,
        TrnCode,
        (SUM(CASE WHEN PolicyUseId in (select UseId From @Table) then TotalPremium else 0 end)) as Value
        AnotherColumn
    FROM SomeTableJoinedOnOtherThings

我遇到的问题是......"无法对包含聚合或子查询的表达式执行聚合函数。"我假设这是对IN表的检查。

我有另外一份报告,除了我只检查我传递查询的参数。

    (CASE PolicyUseId when @UseId then PriceColumn else 0 end)

此查询可以正常运行并完成所有计算。我不确定如何在选择行中没有这个case语句的情况下使总数正确,因为我需要提取2组数据来决定如何在select中添加它们。任何建议都会很棒。

2 个答案:

答案 0 :(得分:4)

也许你根本不需要聚合:

SELECT TrnId, TrnCode,
       (CASE WHEN PolicyUseId in (select UseId From @Table) then TotalPremium else 0 end) as Value
       AnotherColumn
FROM SomeTableJoinedOnOtherThings;

如果确实需要聚合,则需要GROUP BY。然后LEFT JOIN将起作用 - 假设您在@Table中没有重复项:

SELECT TrnId, TrnCode,
       SUM(CASE WHEN tt.UseId IS NOT NULL THEN TotalPremium ELSE 0 END) as Value,
       AnotherColumn
FROM SomeTableJoinedOnOtherThings t LEFT JOIN
     @Table tt
     ON t.PolicyUseId = tt.UseId
GROUP BY TrnId, TrnCode, AnotherColumn;

答案 1 :(得分:2)

您无法针对子查询进行汇总。

也许LEFT OUTER在您的示例中将@table加入到该字段的PolicyUseId字段表中?然后在CASE中检查UseId是否为NULL?