MySQL 查询在第二次执行时返回不同的结果

Dan*_*ith 5 mysql subquery

我对 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)

第一次执行: 第一次执行

第二次执行: 第二次执行

ype*_*eᵀᴹ 6

如果您打算以这种方式使用 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)