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の結果ですが、SUM()がすでにグループ化を行っているため、上記のCONCATの周りにGROUP_CONCATをラップすることはできません。これが私が取り戻す必要があるものです:

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内部サブクエリはすでに集計された列を1つだけ返すため、外部クエリにを含める必要はありません。

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(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 に答える
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 に答える