【问题标题】:Summing a Case Statement with a check for Value in Table Variable通过检查表变量中的值对 Case 语句求和
【发布时间】:2017-10-17 20:59:03
【问题描述】:

我正在处理一份报告,该报告有一些参数传递给它。其中之一是由逗号操作的一串 UserId。这些被拆分并发送到表变量中。在我的查询中,我需要能够对值求和。在其中一些总和中,我需要按情况将此值添加到总和中,而在另一种情况下不添加。代码看起来像这样......

    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 组数据来决定如何将它们添加到选择中。任何建议都会很棒。

【问题讨论】:

  • 如果你删除了SUM,它有用吗?...做一个CTE怎么样?

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


【解决方案1】:

也许你根本不需要聚合:

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;

【讨论】:

  • 非常感谢。从长远来看,这也使查询更容易消化。
【解决方案2】:

您不能针对子查询进行聚合。

也许在您的示例中将 @table 左外连接到该字段上 PolicyUseId 字段的表?然后检查CASE中UseId是否为NULL?

【讨论】:

    猜你喜欢
    • 2022-10-09
    • 1970-01-01
    • 2020-07-30
    • 2012-07-31
    • 2018-09-01
    • 2012-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多