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 . . . 我想我可能会失明。那个标签重复了三次,我还是没注意到。