结合两个MySQL查询显示一个唯一值和对于每列的平均值

问题描述 投票:1回答:1

有没有一种方法来组合使用两个MySQL查询显示一个独特的价值,并针对每一列AVG价值?如在此查询:

SELECT `price`, `cost`, `shipping` 
FROM `orders` 
WHERE `year` = 2019 AND `product_id` = 5 AND `order_id` = 77 
LIMIT 1

WITH

SELECT AVG(`price`), AVG(`cost`), AVG(`shipping`) 
FROM `orders` 
WHERE `year` = 2019 AND `product_id` = 5

我一直在玩与工会和加入,但我没有找到一种方法来在同一查询返回此数据。 (我可以让两个单独的查询,并把得到的数据并排的一面,但我更喜欢用一个查询,如果能够做到这一点。)

有任何想法吗?

mysql sql database
1个回答
2
投票

由于这两个查询返回只有一个记录,你可能只是他们转向子查询和CROSS JOIN它们:

SELECT a.price, a.cost, a.shipping, avg.price, avg.cost, avg.shipping 
FROM 
    ( 
        SELECT `price`, `cost`, `shipping` 
        FROM `orders` 
        WHERE `year` = 2019 AND `product_id` = 5 AND `order_id` = 77 
        LIMIT 1 
    ) a
    CROSS JOIN ( 
        SELECT AVG(`price`) price, AVG(`cost`) cost, AVG(`shipping`) shipping 
        FROM `orders` 
        WHERE `year` = 2019 AND `product_id` = 5 
    ) avg

在第一子查询的LIMIT 1条款的目的尚不清楚:既然没有ORDER BY,它是不可预测的,其记录将如果超过一个匹配返回。

下面是使用聚合条件的替代方法(若有几个记录与订单ID 77存在,将显示各列的最大值):

SELECT
    MAX(CASE WHEN `order_id` = 77 THEN `price` END) price,
    MAX(CASE WHEN `order_id` = 77 THEN `cost` END) cost,
    MAX(CASE WHEN `order_id` = 77 THEN `shipping` END) shipping,
    AVG(`price`) avg_price, 
    AVG(`cost`) avg_cost,
    AVG(`shipping`) avg_shipping
FROM `orders`
WHERE `year` = 2019 AND `product_id` = 5
© www.soinside.com 2019 - 2024. All rights reserved.