Sql 每周都能拿到价格
我有一张简单的桌子:Sql 每周都能拿到价格,sql,sql-server,sql-server-2008,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008,Sql Server 2008 R2,我有一张简单的桌子: prices(fromwhichweek(int),newprice(int)) data example: 1,20 3,21 10,30 所以我在寻找一个sql语句,它返回每周的价格是多少? 如上图3行所示: 1,20 2,20 3,21 4,21 5,21 6,21 7,21 8,21 9,21 10,30 ... 这将为您提供所需的输出。如果您想要不同的内容,请修改您的问题: SELECT fromwhi
prices(fromwhichweek(int),newprice(int))
data example:
1,20
3,21
10,30
所以我在寻找一个sql语句,它返回每周的价格是多少?
如上图3行所示:
1,20
2,20
3,21
4,21
5,21
6,21
7,21
8,21
9,21
10,30
...
这将为您提供所需的输出。如果您想要不同的内容,请修改您的问题:
SELECT
fromwhichweek, price
FROM
prices
ORDER BY
fromwhichweek ASC
您可以创建一个填充了1-52周的表
create table weeks (week int);
insert into weeks values (1), (2), ....(52);
然后可以执行以下查询以获得结果。这是一个本机MYSQL查询。如果您使用的是不同的sql供应商,则可能需要稍微更改它
select A.week, B.price from weeks as A, prices as B where
B.fromwhichweek = (select C.fromwhichweek from prices as C where
C.fromwhichweek <= A.week order by C.fromwhichweek desc limit 1);
您需要生成一系列的周。以下版本通过在select语句中使用相关子查询来获取价格:
select w.week,
(select top 1 newprice from prices p where w.week >= p.fromwhichweek
order by fromwhichweek desc
) theprice
from (select 1 as week union all select 2 union all select 3 union all select 4 union all
select 5 union all select 6 union all select 7 union all select 8 union all
select 9 union all select 10
) w
一些评论。这取决于有一个星期的清单。在这里,它是通过显式子查询完成的。根据数据库的不同,还有其他方法。以下是一种根据表中fromwhichweek值的最高值动态确定所需周数的方法。您可以通过显式地将值指定给@end来扩展它,例如,尝试使用22或25,而不是使用MAX。假设您的价格表真的这么简单,这应该可以扩展到52周
DECLARE @prices TABLE(fromwhichweek INT, newprice INT);
INSERT @prices VALUES
(1, 20),
(3, 21),
(10,30);
DECLARE @start INT, @end INT;
SELECT @start = MIN(fromwhichweek),
@end = MAX(fromwhichweek)
FROM @prices;
;WITH x AS
(
SELECT TOP (@end-@start+1)
n = @start-1+ROW_NUMBER() OVER (ORDER BY [object_id])
FROM sys.all_objects ORDER BY [object_id]
)
SELECT fromwhichweek = x.n,
newprice = COALESCE(p.newprice, (
SELECT TOP (1) newprice FROM @prices
WHERE fromwhichweek <= x.n
AND newprice IS NOT NULL
ORDER BY fromwhichweek DESC))
FROM x
LEFT OUTER JOIN @prices AS p
ON x.n = p.fromwhichweek
ORDER BY x.n;
您的预期结果是否基于您的样本输入?如果是这样的话,你需要对doIt做更多的解释。看起来这里的目标是用前一周的价格来填补缺失的几周。但是我们如何知道请求的周数范围呢?您的示例数据只显示了一次“fromwhichweek”。是否有多个价格不同的“星期”?如果你想要一个更可行的答案,请发布更多的示例数据。示例已编辑。“fromwhichweek”只出现一次。主要的目标是得到一周的价格,因为还有一张有订单的桌子,有哪个星期,哪个人点了什么,像这样:person1,1week,1day,whatordered;人员1,1周,2天,根据需要;人员1,1周,3天,需要什么;人员1,2周,1天,根据需要;人员1,2周,2天,根据需要;我想知道一个人每天要付多少钱,储存在价格表中problem@AaronBertrand . . . 我想我可能会失明。那个标签重复了三次,我还是没注意到。