Sql 如何计算列的不同值的百分比差异

Sql 如何计算列的不同值的百分比差异,sql,ssrs-2008,Sql,Ssrs 2008,有一个列—Current Product—根据库存列的值有两个值。这意味着当库存为空时,它被称为“当前产品”,当它有一些值时,它被称为“匹配”。像这样 ================================================================== Current Product Stocked AnnualSavings Sodium Current product

有一个列—Current Product—根据库存列的值有两个值。这意味着当库存为空时,它被称为“当前产品”,当它有一些值时,它被称为“匹配”。像这样

==================================================================
Current Product       Stocked    AnnualSavings     Sodium
 Current product                                    450.00                    
  Match               yes          1234.00          432.00
现在在SSRS 2008 R2报告中有一个空的钠文本框。当用户输入10 然后我们必须检查钠的匹配值是否比当前产品的匹配值小10%


我该怎么做…?

如果我正确理解您的需求,下面的查询将作为SSRS数据集使用。我认为您希望从表中选择Stocked字段不为null的任何行,以及当前产品特定范围内的钠。该范围由用户指定为报告的参数

在数据集的查询中过滤这一点比在报表本身中过滤要容易得多,因为它依赖于比较记录之间的值

我认为,如果我没有注意到这一点,那么在示例表中再添加几行会有所帮助

;
WITH
(
SELECT
   [Current Product] ,
   [Stocked] ,
   [OriginalProduct] ,
   [Sodium(Mg)]
FROM
   #TempConversion7
WHERE
   MemberPurchaseDataId IN ( SELECT DISTINCT
                              MemberPurchaseDataId
                             FROM
                              #TempConversion7
                             WHERE
                              SrNo > 1 )
                              ) AS ListCTE

SELECT
    *,
    CASE WHEN CurrentProd.[Sodium(Mg)]  >=
    ( MatchProd.[Sodium(Mg)] *(1.0 - ( @MatchValueParameter * 0.01)))
    AND CurrentProd.[Sodium(Mg)]  <=
    ( MatchProd.[Sodium(Mg)] *(1.0 + ( @MatchValueParameter * 0.01)))
    THEN
    1
    ELSE 0
    END
    AS WithinPercentRange
FROM
ListCTE AS CurrentProd
FULL OUTER JOIN
ListCTE AS MatchProd
ON CurrentProd.OriginalProduct = MatchProd.OriginalProduct
AND CurrentProd.[Current Product] = 'Current Product'
AND MatchProd.[Current Product] = 'Match'

如果我正确理解您的需求,下面的查询将作为SSRS数据集使用。我认为您希望从表中选择Stocked字段不为null的任何行,以及当前产品特定范围内的钠。该范围由用户指定为报告的参数

在数据集的查询中过滤这一点比在报表本身中过滤要容易得多,因为它依赖于比较记录之间的值

我认为,如果我没有注意到这一点,那么在示例表中再添加几行会有所帮助

;
WITH
(
SELECT
   [Current Product] ,
   [Stocked] ,
   [OriginalProduct] ,
   [Sodium(Mg)]
FROM
   #TempConversion7
WHERE
   MemberPurchaseDataId IN ( SELECT DISTINCT
                              MemberPurchaseDataId
                             FROM
                              #TempConversion7
                             WHERE
                              SrNo > 1 )
                              ) AS ListCTE

SELECT
    *,
    CASE WHEN CurrentProd.[Sodium(Mg)]  >=
    ( MatchProd.[Sodium(Mg)] *(1.0 - ( @MatchValueParameter * 0.01)))
    AND CurrentProd.[Sodium(Mg)]  <=
    ( MatchProd.[Sodium(Mg)] *(1.0 + ( @MatchValueParameter * 0.01)))
    THEN
    1
    ELSE 0
    END
    AS WithinPercentRange
FROM
ListCTE AS CurrentProd
FULL OUTER JOIN
ListCTE AS MatchProd
ON CurrentProd.OriginalProduct = MatchProd.OriginalProduct
AND CurrentProd.[Current Product] = 'Current Product'
AND MatchProd.[Current Product] = 'Match'

谢谢你的编辑。现在看起来不错。谢谢你的编辑。现在看起来不错。它给了我这样的错误,子查询返回了超过1个值。当子查询在=、!=、=或者当子查询用作表达式时。如何不起作用?还是同样的错误吗?如果是这样的话,你能在你的问题中提供一些样本数据让我重现问题吗?我附上了另一张图片供你理解。这是我的sql查询,用于数据检索选择[Current Product]、[Stocked]、[OriginalProduct]、[SodiumMg]从TempConversion7中的MemberPurchaseDataId中选择不同的MemberPurchaseDataId,从TempConversion7中选择SrNo>1 ORDER BY DNUSFS、ParentName、PIMClassDescription、MemberPurchaseDataId、SrNo ASC、TempAnnSaving ASCJamie,我想你没有真正理解我的意思。请再次查看上述代码并[link]请帮助,我没有忘记这一点。我只想显示我表格中的所有记录,根据我已经讨论过的公式,只有钠列应该受到影响。如果匹配的钠比当前产品少10%,那么两个记录都会显示,如果没有那么就不显示。我想这会给你一个清晰的理解。它给了我这样的错误子查询返回了超过1个值。当子查询在=、!=、=或者当子查询用作表达式时。如何不起作用?还是同样的错误吗?如果是这样的话,你能在你的问题中提供一些样本数据让我重现问题吗?我附上了另一张图片供你理解。这是我的sql查询,用于数据检索选择[Current Product]、[Stocked]、[OriginalProduct]、[SodiumMg]从TempConversion7中的MemberPurchaseDataId中选择不同的MemberPurchaseDataId,从TempConversion7中选择SrNo>1 ORDER BY DNUSFS、ParentName、PIMClassDescription、MemberPurchaseDataId、SrNo ASC、TempAnnSaving ASCJamie,我想你没有真正理解我的意思。请再次查看上述代码并[link]请帮助,我并没有忘记这一点。我只是想显示我的表中的所有记录,根据我已经讨论过的公式,只有钠列应该受到影响。如果匹配的钠比当前产品少10%,那么两个记录都会显示,如果没有,那么就不显示。我想这会给你一个清晰的理解。