我试图通过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
答案 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扩展,可能在将来的版本中发生变化;例如,使优化器能够以其认为最有效的方式对分组进行排序,并避免排序开销。
答案 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