在 SQL 中求解代数方程

Solve Algebraic Equation in SQL

提问人:Tim R 提问时间:11/3/2023 最后编辑:Tim R 更新时间:11/4/2023 访问量:82

问:

我想用SQL求解市场份额的代数方程,求解产品1的数量,达到目标市场份额。

数据

enter image description here

目标:35%

公式:([产品 1 数量] * [目标]) / (([产品 1 数量] * [目标]) + ([产品 2] + 产品 3] + [产品 4]))

x = 目标,A = 乘积 1 数量,B = 总和(乘积 2 数量、乘积 3 数量、乘积 4 数量)

Ax/(Ax+B) = 0.35 or 300x / (300x + 700) = 0.35
  1. 简化:

    3 倍 / 3 倍 + 7 = 0.35

  2. 将两边乘以 3x+7:

    3x = 0.35(3x + 7)

  3. 将两边乘以 100

    300 倍 = 35(3 倍 + 7)

  4. 扩展 35(3x + 7)

    300x = 105x +245

  5. 向左移动

    195x = 245

  6. 解决

    x = 49/39

enter image description here

当前:产品 1 的数量为 1,000 个总数量中的 300 个或 30%。我要解决的是,产品 1 需要多少额外数量才能达到 35%?请记住,产品 1 的增加也会增加总数量。

如何使用MSSQL解决这个问题?还有其他建议吗?非常感谢任何帮助!谢谢。

sql-server t-sql 代数

评论

4赞 Charlieface 11/3/2023
对不起,工作工具错误
1赞 Zack 11/3/2023
如果您有 4 个以上的产品怎么办?
0赞 Tim R 11/3/2023
产品数量是可变的,但只有产品 1 将用作目标。感谢您的回复。
0赞 Zack 11/3/2023
你确定你的数学是对的吗?如果你的目标是 ,计算结果不是 ,计算结果为 ?0.35(0.35 * 300) / ((0.35 * 300) + 200 + 200 + 300)0.13
0赞 Tim R 11/3/2023
我在原始帖子中添加了屏幕截图,以逐步显示如何解决此方程。

答:

2赞 siggemannen 11/3/2023 #1

这是一个略有不同的版本:


DECLARE @target NUMERIC(9,2) = 0.35
,   @A INT
,   @B INT
,   @TARGET_COEFF NUMERIC(19, 9)

SELECT  @A = MAX(CASE WHEN Product = 'Product1' THEN Quantity END)
,   @B = SUM(CASE WHEN Product <> 'Product1' THEN Quantity END)
FROM
(
    VALUES  (N'Product1', 300)
    ,   (N'Product2', 200)
    ,   (N'Product3', 200)
    ,   (N'Product4', 300)
    ,   (N'Total', 1000)
) t (Product,Quantity)
WHERE   Product <> 'Total'

/*
Ax / (Ax + B) = 0.35

Ax = 0.35 * Ax + B * 0.35

Ax - 0.35Ax = B * 0.35

0.65Ax = B * 0.35

x = B * @target / (( 1 - @target) * A)

*/
SELECT  @TARGET_COEFF = @B * @target / ((1 - @target) * @A)

SELECT  @TARGET_COEFF AS coeff, @A * @TARGET_COEFF AS new_quantity, @A * @TARGET_COEFF - @A AS needed
,   @A * @TARGET_COEFF / (@B + @A * @TARGET_COEFF) AS verification

我包含在方程的变换中,这样你就可以得到 x 本身以及一些验证。最重要的是你要正确地转换你的方程。

输出:

系数 new_quantity 需要 验证
1.256410256 376.9230768 76.9230768 0.34999999

评论

0赞 Tim R 11/3/2023
你就是那个男人!谢谢。祝你有美好的一天!这非常有帮助和信息量很大。
1赞 Zack 11/4/2023 #2

为了计算给定产品数量 a 满足指定目标阈值 T(给定其他产品数量 b 之和)所需的最小数量 x,您可以使用以下公式:

x = (Ta - a + Tb) / (1 - T)

最简单的情况是 2 种产品。例如,如果产品 A 和产品 B 的数量均为 5(各 50%),并且您想查看还需要订购多少产品 A 才能达到 60%,则可以按如下方式计算:

x = ((0.6 * 5) - 5 + (0.6 * 5)) / (1 - 0.6) = 2.5

因此,要使任何一种产品达到 60%,您都需要订购(仅)2.5(或实际上,3)。

当您添加其他产品时,等式保持不变:您的 b 只是成为其他产品数量的总和。例如,如果您有 3 个产品,每个产品的数量为 5,则使用 10 表示 b 的值。

但是我们如何将其转化为 SQL?我们可以使用窗口总和来比较每个产品的总数量。然后,我们可以在查询中进行计算(甚至使用横向连接,或在 MS SQL 语法中)以简化等式。例如:CROSS APPLY

DECLARE @target DECIMAL(18,2) = 0.35;

WITH windowed AS 
(
  SELECT *, SUM(quantity) OVER () * 1.0 AS total 
  FROM products
)
SELECT 
  product
  quantity,
  total,
  quantity / total AS current_percent,
  @target AS target_percent,
  CASE 
    WHEN (quantity / total) < @target 
    THEN ((T * a) - a + (T * b)) / (1 - T)
  END AS needed
FROM windowed
  CROSS APPLY
  (
    SELECT 
      quantity AS a,
      total - quantity AS b,
      @target AS T
  ) eq

在这里工作小提琴。