2

我有一个需要创建的大订单列表,并且我需要获取每个订单的产品代码及其数量的列表。

为简化起见,我展示了单个订单的示例,但外部查询需要为系统中的每个订单提供此结果。

到目前为止,我有以下内容:

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 结果,但它不会让我将 GROUP_CONCAT 包裹在上面显示的 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'

4

3 回答 3

2

要应用另一个聚合,您需要将其包装在子查询中。不过,这将对子查询返回的所有行应用聚合GROUP_CONCAT(),就像您所需示例的输出一样。GROUP BY由于内部子查询只返回一个已经聚合的列,因此外部查询中不需要 a

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
于 2013-02-03T19:03:40.937 回答
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
于 2013-02-03T19:03:40.383 回答
1
SELECT GROUP_CONCAT(CONCAT(productcode,'(',n,')')) summary 
  FROM 
     ( SELECT productcode
            , SUM(quantity) n 
         FROM orderproducts 
        WHERE order_id = x
        GROUP 
           BY productcode
     ) x;
于 2013-02-03T19:15:41.060 回答