我对 MySQL 变量不太熟悉,但我试图在计算这些结果时避免冗余的子选择。第一次执行只返回 1 个正确的计算。第二次执行返回所有正确的值。
SELECT
@discount_code := '*******' AS discount_code,
@sales_revenue := (
SELECT
CAST(SUM(total_price) AS UNSIGNED)
FROM
shopify_orders
WHERE
discount_code = @discount_code
) AS sales_revenue,
@rsp_float := (
SELECT
revenue_share_percentage / 100
FROM
kpi_data
WHERE
CODE = @discount_code
) AS rsp_float,
@marketing_spend := (
SELECT
fixed_media_cost + @revenue_share
FROM
kpi_data
WHERE
CODE = @discount_code
) AS marketing_spend,
@roi_dollars := (
@sales_revenue - @marketing_spend
) AS roi_dollars,
@revenue_share := (@sales_revenue * @rsp_float) AS revenue_share,
@roi := CAST(
(@roi_dollars /@marketing_spend) AS DECIMAL (5, 2)
) AS roi,
@mroi := CAST(
(
@sales_revenue / @marketing_spend
) AS DECIMAL (5, 2)
) AS mroi;
Run Code Online (Sandbox Code Playgroud)
如果您打算以这种方式使用 mysql 变量,列的顺序很重要。您@revenue_share
在计算之前正在使用。因此,查询第一次运行时,NULL
用于计算@marketing_spend
。第二次运行查询时,该变量具有第一次运行时保存的值。
此外,具有的两个子查询FROM kpi_data
可以合二为一。而且你真的不需要使用变量。您可以使用派生表和仅一个参数 ( @discount_code
)获得相同的结果,使用了 3 次:
SELECT
@discount_code AS discount_code,
sales_revenue,
rsp_float,
marketing_spend
sales_revenue - marketing_spend AS roi_dollars,
revenue_share,
CAST( ((sales_revenue - marketing_spend) / marketing_spend) AS DECIMAL (5, 2) )
AS roi,
CAST( (sales_revenue / marketing_spend) AS DECIMAL (5, 2) )
AS mroi
FROM
( SELECT
sr.sales_revenue,
kd.revenue_share_percentage / 100 AS rsp_float,
kd.fixed_media_cost,
sr.sales_revenue * kd.rsp_float AS revenue_share,
kd.fixed_media_cost + (sr.sales_revenue * kd.rsp_float)
AS marketing_spend
FROM
( SELECT
CAST(SUM(total_price) AS UNSIGNED) AS sales_revenue
FROM
shopify_orders
WHERE
discount_code = @discount_code
) AS sr
CROSS JOIN
kpi_data AS kd
WHERE
kd.CODE = @discount_code
) AS t ;
Run Code Online (Sandbox Code Playgroud)