【问题标题】:How to exclude one value and make everything that has that value NOT to be in calculation如何排除一个值并使具有该值的所有内容不在计算中
【发布时间】:2016-11-14 17:13:51
【问题描述】:

一个Policy Number 可以有多个不同的ClassCode 并且只有一个Premium 的总量。在我的 SSRS 报告中,我希望能够创建参数 ClassCode,并且如果我排除(取消选中)其中至少一个 ClassCode,则需要不在计算中包含保费的整个保单编号。 可以说,如果我想排除 ClassCode 58,那么 1,644.00 的 Premium 不应该出现在我的报告结果中。

我试图在我的查询AND ClassCode <> 58 中说,但它只排除了一行并保留了高级注释。但我的目标是排除所有具有 ClassCode 58 的内容。

SELECT policynumber,
       classcode,
       /*
       Using ROW_NUMBER() to check if it's the first record in the join and returns the Premium value if so, otherwise it will display 0. 
       The ORDER BY (SELECT 0) is there just because I don't need the row number to be based on any explicit order.
       */
       CASE
         WHEN ROW_NUMBER()
                OVER (
                  PARTITION BY cte1.policynumber
                  ORDER BY (SELECT 0)) = 1 THEN premium
         ELSE 0
       END        AS Premium,
       c.yearnum  TransEffYearNum,
       c.monthnum TransEffMonthNum
FROM   cte1
       INNER JOIN cte2
               ON cte1.policynumber = cte2.policynumber
       RIGHT JOIN tblcalendar c
               ON c.yearnum = Year(cte1.policyeffectivedate)
                  AND c.monthnum = Month(cte1.policyeffectivedate)
WHERE  c.yearnum = 2016
       AND classcode <> 58  

【问题讨论】:

  • ClassCode属于什么表?
  • ClassCode 在我的查询中属于cte2。我只在这里显示最终的SELECT 声明。导致相当长的查询。
  • 那么,对于您的问题示例,您想完全消除 Policy 3 还是只想将 ClassCode 57 的 Premium 变为 0?
  • 如果我消除 ClassCode 58,我想消除 1,644.00 的溢价。所以是的,我想消除与 Policy 3 相关的整数

标签: sql-server tsql reporting-services


【解决方案1】:

您应该首先排除所有具有您要设置的 ClassCode 的 Policy Numbers。 所以而不是 where c.YearNum = 2016 AND ClassCode &lt;&gt; 58

使用

where  PolicyNumber NOT IN
(SELECT  PolicyNumber 
 From cte1 inner join cte2 on cte1.PolicyNumber=cte2.PolicyNumber
 WHERE ClassCode = 58);

应该这样做。

【讨论】:

    【解决方案2】:

    如果您想消除策略 3 的所有行,这可能会起作用。

    SELECT policynumber,
           classcode,
           /*
           Using ROW_NUMBER() to check if it's the first record in the join and returns the Premium value if so, otherwise it will display 0. 
           The ORDER BY (SELECT 0) is there just because I don't need the row number to be based on any explicit order.
           */
           CASE
             WHEN ROW_NUMBER()
                    OVER (
                      PARTITION BY cte1.policynumber
                      ORDER BY (SELECT 0)) = 1 THEN premium
             ELSE 0
           END        AS Premium,
           c.yearnum  TransEffYearNum,
           c.monthnum TransEffMonthNum
    FROM   cte1
           INNER JOIN cte2
                   ON cte1.policynumber = cte2.policynumber
           RIGHT JOIN tblcalendar c
                   ON c.yearnum = Year(cte1.policyeffectivedate)
                      AND c.monthnum = Month(cte1.policyeffectivedate)
    WHERE  c.yearnum = 2016
           AND cte2.policynumber NOT IN (SELECT policynumber FROM cte2 WHERE ClassCode = 58 and policynumber IS NOT NULL);
    

    【讨论】:

    • 谢谢。看起来像正确的逻辑,但我的查询永远旋转。出于某种原因。
    • 我猜你的cte?可能是巨大的。但这是另一个问题。您可能想去掉 cte2 中的 policynumber=3。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多