【问题标题】:SQL ORDER BY command not working with GROUP BYSQL ORDER BY 命令不适用于 GROUP BY
【发布时间】:2018-04-27 18:46:06
【问题描述】:

我正在创建一个新表,它将 stock 表中每个 item_id 的值相加,然后将它们放入新表中。使用此代码可以正常工作:

create table total_stock as (
select item_id,
sum (stock) total_stock
from stock_tbl
group by item_id
);

效果很好,将stock 表中的所有值添加到新表中,但是当我尝试通过item_id 对其进行排序时,它不起作用。任何帮助,将不胜感激。给出的错误是语法错误。

create table total_stock as (
select item_id,
sum (stock) total_stock
from stock_tbl
group by item_id
order by item_id
);

【问题讨论】:

  • 请不要使用不适用于您的问题的标签。我删除了数据库标签,因为不清楚您实际使用的是哪一个。请添加only你实际使用的数据库的标签
  • 我认为这里的主要问题是,为什么插入的顺序在这里很重要?除了@Andomar 的答案(这是正确的)。
  • 对于我的作业,问题希望它们按 item_id 的顺序返回
  • 用您正在使用的数据库标记您的问题。
  • 我看不出group by 与这个问题有什么关系,因为(至少在Oracle 中)order by 子句无论如何在这里都是无效的。实际问题似乎是 ORDER BY not allowed in CREATE TABLE AS SELECT

标签: sql sql-order-by


【解决方案1】:

数据库表中的行的存储没有任何特定顺序。这就是为什么在填写表格时指定order by 不起作用的原因。

在从表中选择行时,您必须order by,而不是在向表中输入行时。

【讨论】:

  • 感谢您的回答,对不起,我是新手。快速跟进问题,它有效,但是它订购了 1、10、11、12... 而不是 1、2、3... 任何您可以提供帮助的机会。对不起,如果这是一个愚蠢的问题。
  • 您可以将字符串排序为整数,如order by cast(item_id as integer)(请参阅stackoverflow.com/questions/11808573/sql-order-string-as-number)但请记住,如果您不指定order by,MySQL 可以按照它选择的任何顺序返回表行。一开始可能看起来一致,但不能保证。
【解决方案2】:

从技术上讲,您可以在大多数数据库中对表中的行进行排序。为此,您可以在用于排序的键上创建聚集索引。

你猜怎么着?

select t.*
from t

仍然 不会按顺序返回行,即使在具有聚集索引的表中也是如此。 *至少,没有保证。 *SQL 结果集是无序的,除非为最外层的SELECT 显式包含ORDER BY。结果集排序的唯一保证是使用order by。在你的情况下,那将是:

select item_id, sum(stock) as total_stock
from stock_tbl
group by item_id
order by item_id;

或:

select ts.*
from total_stock ts
order by item_id;

顺便说一句,不建议为此使用临时表,除非您特别需要具体化结果集。

【讨论】:

    【解决方案3】:

    更新 您可以使用通用表表达式,然后使用此数据插入到您的表中,如

    with CTE as (
    select item_id, sum(stock) total stock
    from stock_table
    ) Insert into total_stock
    select * from cte group by item_id order by item_id
    

    这应该可以解决你的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 2014-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多