' order'附近的语法不正确在插入查询中

时间:2015-06-04 09:53:49

标签: sql sql-server

所以......我希望能够在表格中插入查询结果。

SELECT top 30 dt ,  
count(*) AS NumberOfOrders 
FROM shoptable 
WHERE (name LIKE '%shop%') 
GROUP by dt ORDER by dt

此查询成功返回前几天每天的订单数。

现在我想将其插入名为shop_stats的表中,这是我的查询:

INSERT INTO shop_stats 
(dt, NumberOfOrders) 
(SELECT top 30 dt ,  
count(*) AS NumberOfOrders 
FROM shoptable 
WHERE (name LIKE '%shop%') 
GROUP by dt ORDER by dt)

我收到以下错误:

  

第15行,第1行,第1行,第1行   关键字' order'附近的语法不正确。

如果我删除了order by子句....我将有30个随机日的订单..而不是我需要的最后30天。

有人知道如何以相对简单的方式解决这个问题吗? (即没有其他脚本可以删除不必要的数据等 - 我只需要一个SQL查询)。

4 个答案:

答案 0 :(得分:1)

表格中没有内在的排序顺序 - 任何特定的排序都应该在您获取数据时完成,而不是在您将其放入时。
因此,只需删除order by子句,插入它们,然后在选择它们时再次对它们进行排序。

那说,如果你绝对肯定需要按照指定的顺序插入它们(如你的情况那样),你可以使用带有top子句的子查询

insert into shop_stats (dt, NumberOfOrders) 
select * 
  from (select top 30 dt, count(*) as NumberOfOrders 
        from shoptable 
        where (name like '%shop%') 
        group by dt 
        order by dt)

答案 1 :(得分:0)

with cte (dt,numberoforders)
as
(
select top 30 dt,count(*) as NumberOfOrders from shoptable where (name
like '%shop%') group by dt order by dt
)
insert into shop_stats (dt, NumberOfOrders) select * from cte

答案 2 :(得分:0)

虽然表中没有行的隐式排序,但插入中的order by有一个不寻常的扩展名。如果你这样做:

INSERT INTO shop_stats(dt, NumberOfOrders) 
    SELECT top 30 dt, count(*) AS NumberOfOrders 
    FROM shoptable 
    WHERE name LIKE '%shop%')
    GROUP by dt
    ORDER by dt;

shoptable有一个identityprimary key列,然后保证分配给该行的标识值按指定的顺序排列。这些行可能不会按顺序插入表中,但标识列会遵循排序。

在文档中很难找到。不幸的是,文档中的几乎所有引用都解释了这不适用于select into。这是一个reference

答案 3 :(得分:0)

每当您在order by中使用() or brackets子句时都无效。

使用下面的代码,工作正常。

insert into shop_stats (dt, NumberOfOrders) 
select * 
  from (select top 30 dt, count(*) as NumberOfOrders 
        from shoptable 
        where (name like '%shop%') 
        group by dt )
        order by dt