mysql - MySQL - 聚合和 GROUP BY 与子查询
问题描述
是否可以使用 GROUP BY 来聚合带有子查询的单元格?我正在使用的数据库包含客户订单信息(订单 ID、名称、地址、产品、选项等)。当客户为产品选择多个选项时,它们会出现在不同的行中。我需要通过将所有产品选项映射到新列来将它们聚合到同一行,但由于我有子查询,所以不确定在哪里添加 GROUP BY...
这是查询: http ://sqlfiddle.com/#!9/83a399/4/0
预期输出:
Order ID | Qty | Option | Size | Product | Ref
-----------------------------------------------
12345 | 1 | R | L | Tee | R / Tee L
12346 | 2 | Bl | S | Hood | 2x Bl / Hood S
解决方案
GROUP BY 具有唯一键和 zse 用于其余聚合函数的列,如您的情况下的 MAX
SELECT
`Order ID`,
`Qty`,
MAX(`Option`),
MAX(`Size`),
`Product`,
MAX(CONCAT (
CASE
WHEN `Qty` > 1
THEN CONCAT (`Qty`, 'x ')
ELSE ''
END,
`Option`,
' / ',
`Product`,
CASE
WHEN COALESCE (`Size`, '') != ''
THEN CONCAT (' ', `Size`)
ELSE ''
END
))
AS `Ref`
FROM (
SELECT
`order`.`order_id` AS `Order ID`,
`order_product`.`quantity` AS `Qty`,
CASE
WHEN `order_option`.`value` LIKE '%Red%' THEN 'R'
WHEN `order_option`.`value` LIKE '%Blue%' THEN 'Bl'
END AS `Option`,
CASE
WHEN `order_product`.`name` LIKE '%t-shirt%' THEN 'Tee'
WHEN `order_product`.`name` LIKE '%hoodie%' THEN 'Hood'
ELSE `order_product`.`name`
END AS `Product`,
CASE
WHEN `order_option`.`value` LIKE '%Small%' THEN 'S'
WHEN `order_option`.`value` LIKE '%Medium%' THEN 'M'
WHEN `order_option`.`value` LIKE '%Large%' THEN 'L'
ELSE ''
END AS `Size`
FROM
`order`,
`order_product`,
`order_option`
WHERE
`order`.`order_id` = `order_option`.`order_id` AND
`order_product`.`order_product_id` = `order_option`.`order_product_id`
ORDER BY `order`.`order_id` ASC
) AS `Orders`
GROUP BY
`Order ID`,
`Qty`,
`Product` ;
推荐阅读
- sql - 如何加快这个 PostgreSQL UPDATE FROM sql 查询的速度?目前完成运行需要几天时间
- c# - 如何 Debug.log 或打印到屏幕?
- python - 有没有办法从 Django 中的另一个视图调用帖子?
- javascript - Javascript 不等待 Promise 在函数中解析
- encryption - 解码 Tp-Link Tapo c200 IoT IP 摄像机的 Discovery udp 数据包有效负载的二进制部分
- sql - Access Query 和 VBA SQL 为“Having”返回不同的数据
- r - 探索澳大利亚人口普查数据的最佳方式?
- c++ - 限制类成员指针的限定符
- javascript - 勾选订单号
- c++ - gradle 使用什么版本的 c++?是不是已经安装的版本?