簡體   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