提问人:Tim R 提问时间:11/3/2023 最后编辑:Tim R 更新时间:11/4/2023 访问量:82
在 SQL 中求解代数方程
Solve Algebraic Equation in SQL
问:
我想用SQL求解市场份额的代数方程,求解产品1的数量,达到目标市场份额。
数据:
目标:35%
公式:([产品 1 数量] * [目标]) / (([产品 1 数量] * [目标]) + ([产品 2] + 产品 3] + [产品 4]))
设 x = 目标,A = 乘积 1 数量,B = 总和(乘积 2 数量、乘积 3 数量、乘积 4 数量)
Ax/(Ax+B) = 0.35 or 300x / (300x + 700) = 0.35
简化:
3 倍 / 3 倍 + 7 = 0.35
将两边乘以 3x+7:
3x = 0.35(3x + 7)
将两边乘以 100
300 倍 = 35(3 倍 + 7)
扩展 35(3x + 7)
300x = 105x +245
向左移动
195x = 245
解决
x = 49/39
当前:产品 1 的数量为 1,000 个总数量中的 300 个或 30%。我要解决的是,产品 1 需要多少额外数量才能达到 35%?请记住,产品 1 的增加也会增加总数量。
如何使用MSSQL解决这个问题?还有其他建议吗?非常感谢任何帮助!谢谢。
答:
这是一个略有不同的版本:
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 |
评论
为了计算给定产品数量 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
在这里工作小提琴。
评论
0.35
(0.35 * 300) / ((0.35 * 300) + 200 + 200 + 300)
0.13