MySQL在不同时期内平均更新

时间:2018-11-15 13:04:41

标签: mysql

我希望我可以将这3个更新查询烘焙到一个有效且美观的查询中,以更新我的价格表。我知道有些人可能想知道为什么我甚至还在进行此更新,而不仅仅是在需要数据时动态地进行平均,您可能会一直想知道。

查询1使用12个月内的价格组的平均价格更新价格表。

查询2使用6个月内的价格组平均价格更新价格表。

查询3使用三个月内的价格组的平均价格更新价格表。

SET
@p12 = '2017-12-01',
@p6 = '2018-06-01',
@p3 = '2018-09-01',
@p1 = '2019-12-01';

/* AVG PRICE 12 MONTHS */
UPDATE
    prices
JOIN product ON
    product.id = prices.product_id
JOIN(
        SELECT
            pricegroup,
            AVG( price ) as avg_price
        FROM
            price_temp
        WHERE
            sales_date BETWEEN @p12 AND @p1
        GROUP BY
            pricegroup
    ) as a ON
    a.pricegroup = product.pricegroup
SET
    prices.price_12 = a.avg_price
WHERE
    prices.`date` = @p1;

/* AVG PRICE 6 MONTHS */
UPDATE
    prices
JOIN product ON
    product.id = prices.product_id
JOIN(
        SELECT
            pricegroup,
            AVG( price ) as avg_price
        FROM
            price_temp
        WHERE
            sales_date BETWEEN @p6 AND @p1
        GROUP BY
            pricegroup
    ) as a ON
    a.pricegroup = product.pricegroup
SET
    prices.price_6 = a.avg_price
WHERE
    prices.`date` = @p1;

/* AVG PRICE 3 MONTHS */
UPDATE
    prices
JOIN product ON
    product.id = prices.product_id
JOIN(
        SELECT
            pricegroup,
            AVG( price ) as avg_price
        FROM
            price_temp
        WHERE
            sales_date BETWEEN @p3 AND @p1
        GROUP BY
            pricegroup
    ) as a ON
    a.pricegroup = product.pricegroup
SET
    prices.price_3 = a.avg_price
WHERE
     prices.`date` = @p1;

----价格表----

| id | product_id | date | price | price_3 | price_6 | price_12 |

----产品表----

| id | pricegroup |

---- Price_temp表----

| pricegroup | sales_date | price |

1 个答案:

答案 0 :(得分:0)

因此,在查看了案例之后,我重新进行了查询并在AVG中使用了案例

UPDATE
    prices
JOIN product ON
    product.id = prices.product_id
JOIN(
        SELECT
            pricegroup,
            avg(CASE WHEN sales_date = @p1 THEN price END) as p1,
            avg(CASE WHEN sales_date BETWEEN @p3 AND @p1 THEN price END) as p3,
            avg(CASE WHEN sales_date BETWEEN @p6 AND @p1 THEN price END) as p6,
            avg(CASE WHEN sales_date BETWEEN @p12 AND @p1 THEN price END) as p12
        FROM
            price_temp
        GROUP BY
            pricegroup
    ) as a ON
    a.pricegroup = product.pricegroup
SET
    prices.price = IF(a.p1 IS NULL, 0, a.p1),
    prices.price_3 = IF(a.p3 IS NULL, 0, a.p3),
    prices.price_6 = IF(a.p6 IS NULL, 0, a.p6),
    prices.price_12 = IF(a.p12 IS NULL, 0, a.p12)
相关问题