3

1年の特定の週の売上データを保存する次の表があります。

売上高

week | year | value
50   | 2011 | 150
51   | 2011 | 151
52   | 2011 | 152
1    | 2012 | 170
2    | 2012 | 190
3    | 2012 | 180
4    | 2012 | 160
5    | 2012 | 170
6    | 2012 | 290

year1のweek1とyear2のweek2の間にあるレコードを見つけたいです。

例えば

  1. 2011年の第50週から2012年の第5週まで
  2. 2012年の第1週から2012年の第6週まで

sQLの経験がほとんどないので、ケース2では機能するがケース1では機能しないクエリを実行してみました。

SELECT * from sales WHERE (week >= 1 AND year >= 2012) AND (week <= 6 AND year <= 2012 ) 

私が理解しているように、条件のグループ化は機能しないようです。条件のグループ化がないかのようになります。

4

4 に答える 4

4
select *
from
(
   Select *, year*100 + week as yearweek
   from table
) v
where yearweek between 201150 and 201205
于 2012-08-29T08:34:00.327 に答える
1

アドホックレコードを比較することで、よりシンプル、高速、エレガントになります。

SELECT *
FROM   tbl
WHERE (year, week) BETWEEN (2011, 50) AND (2012, 5);

ベンチマークを含む、この密接に関連する回答の詳細と、いくつかの可能な解決策。

于 2012-08-29T23:52:20.457 に答える
0

このクエリはケース1で機能します。

SELECT * from sales WHERE (week >= 50 AND year = 2011) OR (week <= 5 AND year = 2012 )

これは、隣接する年のほとんどの場合に機能するはずです(たとえば、2011年と2012年など、2001年から2010年には機能しません)。その場合はもう少し複雑ですが、それでもかなり簡単です。

DECLARE @week1 INT
DECLARE @week2 INT
DECLARE @year1 INT
DECLARE @year2 INT

SELECT * from sales WHERE (week >= @week1 AND year = @year1) OR (week <= @week2 AND year = @year2 )

さて、これがより広い範囲の例です。

DECLARE @week1 INT
DECLARE @week2 INT
DECLARE @year1 INT
DECLARE @year2 INT

SELECT * from sales WHERE (week >= @week1 AND year = @year1) OR (week <= @week2 AND year = @year2 ) OR (year > @year1 AND year < @year2)
-- This last one gives ALL weeks for the full years between year1 and year2 (e.g. all weeks for 2002-2009 if we choose dates between 2001 and 2010)
于 2012-08-29T08:32:53.080 に答える
0

最初の例としてこれを試してください

    SELECT * 
    FROM sales 
    WHERE (year = 2011 AND week > 50) 
       OR (year = 2012 AND week < 5)

一般に

    SELECT * 
    FROM sales 
    WHERE (year = 'year1' AND week > 'week1') 
       OR  (year > 'year1' AND year < 'year2' ) 
       OR (year = 'year2' AND week < 'week2' )
于 2012-08-29T08:33:49.013 に答える