Mysql按组后排序?

时间:2018-04-19 11:09:34

标签: mysql sql group-by sql-order-by

嗨我有像

这样的Sql结果

sql result

我的查询就像

SELECT sales_flat_order.entity_id AS entity_id,
      CASE
          WHEN sales_flat_order.`grand_total` BETWEEN '0' AND '100.99' THEN '0->100.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '101' AND '150.99' THEN >'101-150.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '151' AND '200.99' THEN >'151-200.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '201' AND '250.99' THEN >'201-250.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '251' AND '300.99' THEN >'251-300.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '301' AND '350.99' THEN >'301-350.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '351' AND '400.99' THEN >'351-400.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '401' AND '450.99' THEN >'401-450.99'
          WHEN sales_flat_order.`grand_total` BETWEEN '451' AND '500.99' THEN >'451-500.99'
          ELSE '501+'
      END AS 'order_range',
      CONCAT(MONTHNAME(sales_flat_order.created_at), ' - ', >YEAR(sales_flat_order.created_at)) AS 'Month',
      CONCAT('$', FORMAT(SUM(sales_flat_order.`grand_total`), 2)) AS 'Sales',
      sales_flat_order.`grand_total` AS Amount,
      COUNT(sales_flat_order.entity_id) AS 'Orders' 
FROM sales_flat_order GROUP BY MONTH,order_range 
ORDER BY Amount ASC

我需要通过升序第二列'订单范围'来订购结果。

我的预期答案应该是

Feb 2015 | 0-100  | XXX <br>
Feb 2015 | 101-150| XXX <br>
Feb 2015 | 150-200| XXX <br>
Feb 2015 | 200-250| XXX <br>
Feb 2015 | 250-300| XXX <br>

2 个答案:

答案 0 :(得分:0)

您可以在此处使用SUBSTRING_INDEX

ORDER BY
    Month,
    CAST(SUBSTRING_INDEX(order_range, '-', 1) AS UNSIGNED);

enter image description here

这是一个演示,表明这个排序逻辑有效:

Demo

修改

不要将年份和月份作为文本报告,首先是月份,然后是年份,因为您也会在那里邀请排序问题。相反,请使用DATE_FORMAT订购:

ORDER BY
    DATE_FORMAT(sales_flat_order.created_at, '%Y-%m'),
    CAST(SUBSTRING_INDEX(order_range, '-', 1) AS UNSIGNED);

答案 1 :(得分:0)

只需使用以下内容更新“订单依据”查询部分:

ORDER BY MONTH, FIELD(order_range,
'0->100.99',
'101-150.99',
'201-250.99',
...
)