所以......我希望能够在表格中插入查询结果。
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查询)。
答案 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
有一个identity
,primary 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