我有一个需要创建的大订单清单,我需要按订单获取产品代码及其数量清单。
为了简化,我展示了单个订单的示例,但外部查询需要为系统中的每个订单提供此结果。
到目前为止,我有以下内容:
mysql> select ProductCode,Quantity from OrderProducts where Order_ID = X;
+-------------+----------+
| ProductCode | Quantity |
+-------------+----------+
| PROD1 | 1 |
| PROD2 | 1 |
| PROD1 | 1 |
+-------------+----------+
3 rows in set (0.00 sec)
mysql> SELECT CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') FROM OrderProducts WHERE Order_ID = X GROUP BY OrderProducts.ProductCode;
+------------------------------------------------------------------------+
| CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') |
+------------------------------------------------------------------------+
| PROD1 (2) |
| PROD2 (1) |
+------------------------------------------------------------------------+
2 rows in set (0.00 sec)
我需要的是上面查询的GROUP_CONCAT结果,但它不会让我围绕上面显示的CONCAT包装GROUP_CONCAT,因为我认为因为SUM()已经在进行分组。这是我需要回来的:
PROD1 (2),PROD2 (1)
修改
我不清楚上面使用的查询。我将使用该查询作为select中的子查询,该查询将查询Orders
中的所有订单。以下是查询的更新版本:
SELECT
(
SELECT
GROUP_CONCAT(SerialNumberedProductCount)
FROM
(
SELECT
OrderProducts.Order_ID,
CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS SerialNumberedProductCount
FROM
OrderProducts, Products
WHERE
OrderProducts.Order_ID = Orders.Order_ID AND
OrderProducts.Product_ID = Products.Product_ID AND
Products.IsSerialNumbered = 1
GROUP BY
OrderProducts.ProductCode
) SerialNumberedProductCountsSubQuery
WHERE
SerialNumberedProductCountsSubQuery.Order_ID = Orders.Order_ID
) AS SerialNumberedProductCounts
FROM
Orders
通过上述查询,我收到以下错误:
ERROR 1054 (42S22): Unknown column 'Orders.Order_ID' in 'where clause'
答案 0 :(得分:2)
要应用其他聚合,您需要将其包装在子查询中。这将对子查询返回的所有行应用聚合GROUP_CONCAT()
,就像所需示例的输出一样。由于内部子查询仅返回已聚合的列,因此外部查询中不需要GROUP BY
SELECT GROUP_CONCAT(prod_sum)
FROM (
SELECT CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS prod_sum
FROM OrderProducts
WHERE Order_ID = 'X'
GROUP BY OrderProducts.ProductCode
) subq
http://sqlfiddle.com/#!2/68bca/4
要将子查询的结果与Orders
相结合,您可能应该加入整个构造而不是使用子选择。
SELECT
/* Replace these with the columns you actually need */
Orders.*,
SerialNumberedProductCounts.*
FROM
Orders
LEFT JOIN (
SELECT
Order_ID,
GROUP_CONCAT(SerialNumberedProductCount)
FROM
(
SELECT
OrderProducts.Order_ID,
CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') AS SerialNumberedProductCount
FROM
OrderProducts, Products
WHERE
OrderProducts.Product_ID = Products.Product_ID AND
Products.IsSerialNumbered = 1
GROUP BY
OrderProducts.ProductCode
) SerialNumberedProductCountsSubQuery
GROUP BY Order_Id
) AS SerialNumberedProductCounts
ON SerialNumberedProductCounts.Order_ID = Orders.Order_ID
答案 1 :(得分:1)
您可以像这样使用
SELECT
GROUP_CONCAT(con) as Con
from (SELECT
CONCAT(OrderProducts.ProductCode,' (',SUM(OrderProducts.Quantity),')') as Con
FROM OrderProducts
WHERE Order_ID = X
GROUP BY OrderProducts.ProductCode
) as r
答案 2 :(得分:1)
SELECT GROUP_CONCAT(CONCAT(productcode,'(',n,')')) summary
FROM
( SELECT productcode
, SUM(quantity) n
FROM orderproducts
WHERE order_id = x
GROUP
BY productcode
) x;