разместить заказ в нужном месте mysql - PullRequest
0 голосов
/ 19 июня 2020

у меня есть такой запрос

SELECT COALESCE(p.name, 'total') AS `product name`, 
       SUM(omd.quantity) AS `Qty(kg)`,
       SUM(omd.quantity) / any_value(total_sum) * 100 AS `Qty(%)`, 
       COUNT(om.id) AS `COunt Order`,
       COUNT(om.id) / any_value(total_count) * 100 AS `Count Order(%)`
FROM order_match om
INNER JOIN order_match_detail omd
ON om.id = omd.order_match_id
INNER JOIN product p
on omd.product_id = p.id
INNER JOIN (select SUM(omd1.quantity) total_sum,
        count(om1.id) total_count
    FROM order_match om1
    INNER JOIN 
    order_match_detail omd1
    ON om1.id = omd1.order_match_id
    where om1.order_status_id in 
    (4, 5, 6, 8)) totals
    where om.order_status_id in (4, 5, 6, 8)
    group by p.name with rollup;

, и после выполнения этого запроса результат был следующим (это просто пустышка)

+--------------+---------+--------+-------------+-----------------+
| Product Name | Qty(kg) | Qty(%) | COunt Order | Count Order (%) |
+--------------+---------+--------+-------------+-----------------+
| Product A    |      20 |     20 |          10 |              10 |
| Product B    |      30 |     30 |          10 |              10 |
| Product C    |      45 |     45 |          30 |              30 |
| Product D    |       5 |      5 |          50 |              50 |
| TOtal        |     100 |    100 |         100 |             100 |
+--------------+---------+--------+-------------+-----------------+

Я хочу поставить order by и заказать на основе Qty (кг)

ожидаемый результат был следующим

 +--------------+---------+--------+-------------+-----------------+
| Product Name | Qty(kg) | Qty(%) | COunt Order | Count Order (%) |
+--------------+---------+--------+-------------+-----------------+
| Product C    |      45 |     45 |          30 |              30 |
| Product B    |      30 |     30 |          10 |              10 |
| Product A    |      20 |     20 |          10 |              10 |
| Product D    |       5 |      5 |          50 |              50 |
| TOtal        |     100 |    100 |         100 |             100 |
+--------------+---------+--------+-------------+-----------------+

, так что это мой запрос после того, как я разместил заказ на

SELECT COALESCE(p.name, 'total') AS `product name`, 
       SUM(omd.quantity) AS `Qty(kg)`,
       SUM(omd.quantity) / any_value(total_sum) * 100 AS `Qty(%)`, 
       COUNT(om.id) AS `COunt Order`,
       COUNT(om.id) / any_value(total_count) * 100 AS `Count Order(%)`
FROM order_match om
INNER JOIN order_match_detail omd
ON om.id = omd.order_match_id
INNER JOIN product p
on omd.product_id = p.id
INNER JOIN (select SUM(omd1.quantity) total_sum,
        count(om1.id) total_count
    FROM order_match om1
    INNER JOIN 
    order_match_detail omd1
    ON om1.id = omd1.order_match_id
    where om1.order_status_id in 
    (4, 5, 6, 8)) totals
    where om.order_status_id in (4, 5, 6, 8)
    group by p.name with rollup
    order by omd.quantity DESC;

, но после запуска это уведомление, как это

Error COde :1221. Incorrect usage of CUBE/R0LLUP and ORDER BY

, поэтому какую часть я должен отредактировать или добавить, чтобы ее можно было упорядочить по тому, что я хочу

1 Ответ

1 голос
/ 19 июня 2020

Не добавляйте ORDER BY после GROUP BY WITH ROLLUP. Преобразуйте свой запрос в подзапрос (или CTE, если его версия 8+) и отсортируйте его вывод во внешнем запросе, сохраняя результат объединения последним:

SELECT *
FROM ( SELECT COALESCE(p.name, 'Total') AS `product name`, 
              SUM(omd.quantity) AS `Qty(kg)`,
              SUM(omd.quantity) / ANY_VALUE(total_sum) * 100 AS `Qty(%)`, 
              COUNT(om.id) AS `Count Order`,
              COUNT(om.id) / ANY_VALUE(total_count) * 100 AS `Count Order(%)`
       FROM order_match AS om
       INNER JOIN order_match_detail AS omd ON om.id = omd.order_match_id
       INNER JOIN product AS p ON omd.product_id = p.id
       CROSS JOIN ( SELECT SUM(omd1.quantity) AS total_sum,
                           COUNT(om1.id) AS total_count
                    FROM order_match AS om1
                    INNER JOIN order_match_detail AS omd1 ON om1.id = omd1.order_match_id
                    WHERE om1.order_status_id IN (4, 5, 6, 8)
                  ) AS totals
       WHERE om.order_status_id IN (4, 5, 6, 8)
       GROUP BY p.name WITH ROLLUP 
     ) AS subquery
ORDER BY `product name`='Total', `Qty(kg)` DESC;
...