Объедините два запроса MySQL, чтобы отобразить одно уникальное значение и значение AVG для каждого столбца. - PullRequest
0 голосов
/ 12 февраля 2019

Есть ли способ объединить два запроса 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

Я играл с профсоюзами и объединениями, но не могу найти способ вернутьсяэти данные в том же запросе.(Я могу сделать два отдельных запроса и поставить полученные данные рядом, но я бы предпочел сделать это с одним запросом, если это возможно.)

Есть идеи?

1 Ответ

0 голосов
/ 12 февраля 2019

Поскольку оба запроса возвращают только одну запись, вы можете просто превратить их в подзапросы и 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, непредсказуемо, какая запись будет возвращена при совпадении более чем одной.

Вот альтернативный подход с использованием условной агрегации (если существует несколько записей с идентификатором заказа 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...