![](/img/trans.png)
[英]How to SELECT two records for each unique column value as one row in MySQL?
[英]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.