按案例陈述MySQL分组

时间:2014-08-25 03:40:25

标签: mysql database

我试图通过CASE声明分组,但没有太多运气。我有一个订单表,我试图按月的总价值对订单进行分组,并根据它们的价值对它们进行分类。

 SELECT 
      CASE
          WHEN sum(order_total_price) IS NULL
            THEN 'Unknown'
          WHEN sum(order_total_price) <= 1000
            THEN 'Not more than 1,000'
          WHEN sum(order_total_price) <= 2000
            THEN 'Between 1,001 and 2000'
          WHEN sum(order_total_price) <= 3000
            THEN 'Between 2001 and 3000'
          WHEN sum(order_total_price) <= 4000
            THEN 'Between 3001 and 4000'
          WHEN sum(order_total_price) <= 5000
            THEN 'Between 4001 and 5000'
          ELSE 'Over 5000'
        END
          AS  total_sales,
        COUNT(*) as total
      FROM orders
      WHERE YEAR(order_time)=2014 and MONTH(order_time)=07

      GROUP BY total_sales

4 个答案:

答案 0 :(得分:0)

这方面的简写是

....
GROUP BY 1

使用输出列位置。否则,您必须重复case子句中的整个GROUP BY块。

答案 1 :(得分:0)

您的查询应该返回一行。运气没有任何关系。重要的是规范。除了SQL查询之外,还不清楚要返回的结果集。

我猜测(这只是一个猜测)你想要返回多行,每个行由CASE表达式派生的每个订单大小类别。

查询返回的结果集可能是这样的:

SELECT CASE
       WHEN o.order_total_price IS NULL
         THEN 'Unknown'
       WHEN o.order_total_price <= 1000
         THEN 'Not more than 1,000'
       WHEN o.order_total_price <= 2000
         THEN 'Between 1,001 and 2000'
       WHEN o.order_total_price <= 3000
         THEN 'Between 2001 and 3000'
       WHEN o.order_total_price <= 4000
         THEN 'Between 3001 and 4000'
       WHEN o.order_total_price <= 5000
         THEN 'Between 4001 and 5000'
         ELSE 'Over 5000'
       END AS order_value_category 
     , SUM(o.order_total_price) AS total_sales
     , COUNT(*) AS count_sales
  FROM orders o
 WHERE o.order_time >= '2014-07-01' 
   AND o.order_time <  '2014-07-01' + INTERVAL 1 MONTH
 GROUP BY order_value_category

为了提高性能,为了使MySQL能够使用合适的索引来满足order_time类别的谓词,我们需要引用&#34;裸&#34;范围扫描谓词中的order_time列。

请注意,GROUP BY子句意味着ORDER BY子句;如果您希望按顺序返回的行而不是派生的order_value_category列,则需要指定合适的ORDER BY子句。

答案 2 :(得分:0)

如果使用GROUP BY,则输出行将根据GROUP BY列进行排序,就好像您具有相同列的ORDER BY一样。为了避免GROUP BY产生的排序开销,添加ORDER BY NULL:

SELECT a,COUNT(b)FROM test_table GROUP BY ORDER BY NULL; 不推荐在MySQL 5.6中依赖隐式GROUP BY排序。要实现分组结果的特定排序顺序,最好使用显式ORDER BY子句。 GROUP BY排序是一个MySQL扩展,可能在将来的版本中发生变化;例如,使优化器能够以其认为最有效的方式对分组进行排序,并避免排序开销。

Take a look at this link

答案 3 :(得分:-1)

吉姆加里森说,

GROUP BY 1

最好。

作为替代方案,如果您不熟悉分组中的数字,则下面也会有效。将没有GROUP BY的原始查询作为内部查询。在外部查询中使用count和group by。

  SELECT A.TOTAL_SALES, COUNT(1) FROM
  (SELECT 
      CASE
          WHEN sum(order_total_price) IS NULL
            THEN 'Unknown'
          WHEN sum(order_total_price) <= 1000
            THEN 'Not more than 1,000'
          WHEN sum(order_total_price) <= 2000
            THEN 'Between 1,001 and 2000'
          WHEN sum(order_total_price) <= 3000
            THEN 'Between 2001 and 3000'
          WHEN sum(order_total_price) <= 4000
            THEN 'Between 3001 and 4000'
          WHEN sum(order_total_price) <= 5000
            THEN 'Between 4001 and 5000'
          ELSE 'Over 5000'
        END
          AS  total_sales       
      FROM orders
      WHERE YEAR(order_time)=2014 and MONTH(order_time)=07

      ) AS A
      GROUP BY A.total_sales