繁体   English   中英

结合两个MySQL查询以为每个列显示一个唯一值和一个AVG值

[英]Combine two MySQL queries to display one unique value and an AVG value for each column

有没有一种方法可以结合两个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

我一直在使用联合和联接,但没有找到在同一查询中返回此数据的方法。 (我可以进行两个单独的查询,并将结果数据并排放置,但是如果可能的话,我更愿意使用一个查询。)

有任何想法吗?

由于两个查询都只返回一条记录,因此您可以将它们转换为子查询,然后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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM