0

私は簡単なテーブルを持っています:

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
... 
4

4 に答える 4

0

一連の週を生成する必要があります。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

いくつかのコメント。これは、週のリストがあるかどうかによって異なります。ここでは、明示的なサブクエリを使用して実行されます。データベースに応じて、他の方法があります。

于 2013-03-27T01:11:37.250 に答える
0

fromwhichweek表の最大値に基づいて、動的に必要な週数を決定する方法は次のとおりです。@endを使用する代わりに、値を明示的に割り当てる(たとえば、22または25で試す)ことにより、それを超えて拡張できますMAX。価格表が本当にこれほど単純であると仮定すると、これは52週間でOKにスケーリングするはずです。

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;
于 2013-03-27T01:39:40.377 に答える
-1

これにより、希望どおりの出力が得られます。別の何かが必要な場合は、質問を変更してください:)

SELECT
  fromwhichweek, price
FROM
  prices
ORDER BY
  fromwhichweek ASC
于 2013-03-27T00:26:27.197 に答える
-2

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);
于 2013-03-27T01:08:25.597 に答える