2017-08-25 52 views
0

这是表我:SQL ORDER BY - 为什么它不在这里工作?

+---------------------+--------+----------+ 
| date    | sku | quantity | 
+---------------------+--------+----------+ 
| 2017-08-23 14:58:00 | 123333 |  2 | 
| 2017-08-23 14:58:00 | 123333 |  1 | 
| 2017-08-23 14:58:00 | 123333 |  1 | 
| 2017-08-23 14:58:00 | 123337 |  2 | 
| 2017-08-23 14:58:00 | 123335 |  1 | 
| 2017-08-23 14:58:00 | 123331 |  1 | 
| 2017-08-23 14:58:00 | 123332 |  2 | 
| 2017-08-23 14:58:00 | 123333 |  1 | 
| 2017-08-23 14:58:00 | 123334 |  1 | 
| 2017-08-23 14:58:00 | 123334 |  3 | 
+---------------------+--------+----------+ 

我想如下执行select语句:

select sku,sum(quantity) as 'total quant' from transactions 
where DATE(date) between '2017-07-23' and '2017-09-23' 
group by sku 
order by quantity desc; 

但我得到这个:

+--------+-------------+ 
| sku | total quant | 
+--------+-------------+ 
| 123332 | 2   | 
| 123337 | 2   | 
| 123333 | 5   | 
| 123334 | 4   | 
| 123335 | 1   | 
| 123331 | 1   | 
+--------+-------------+ 

哪一项不是按我期待的顺序排列。 为什么订单不在这里工作?

边注quantity列的数据类型为int的,我已经试过铸造在this post但无济于事建议。

+0

难道你不想通过总量来订购吗? –

+0

该ORDER BY无效。应该引发错误... – jarlh

+0

执行'ORDER BY'total quant'desc'。 – jarlh

回答

6

您正在按数量订购。因为它没有被聚合,所以你从每个组中获得一个任意值。您需要按总数订购。一种方法是:

order by sum(quantity) desc 

不过,我会建议分配合理的别名(一个不需要进行转义),并使用:

select sku,sum(quantity) as total_quantity 
from transactions 
where DATE(date) between '2017-07-23' and '2017-09-23' 
group by sku 
order by total_quantity desc; 
+0

我明白了,但为什么它不承认'秩序'总量子 ''?为什么逃跑失败? – JWizard

+0

感谢您的解释,但是您可能会在“每个组的任意值”上画灯。你的意思是给变量'quantity'赋予一些不在resulset中的值吗? – JWizard

+1

@Giovanrich您应该使用反引号来转义列名和别名。单引号创建文字字符串。请参阅https://stackoverflow.com/questions/11321491/when-to-use-single-quotes-double-quotes-and-backticks – Barmar

2

您需要通过SUM(quantity)来订购。

SELECT sku, SUM(quantity) AS 'total quant' 
FROM transactions 
WHERE DATE(date) BETWEEN '2017-07-23' AND '2017-09-23' 
GROUP BY sku 
ORDER BY SUM(quantity) DESC; 
+0

这工作,感谢您的快速反应 – JWizard

0

你应该使用:

order by sum(quantity)