2017-06-23 6 views
0

私は私が必要なものをやってに近いクエリを持っている:MSSQL - 各月を4週間にどのように分割するのですか?

select * 
    from 
    (
    select  DATEPART (YEAR, order_date) as theYear, 
       DATEPART (WEEK, order_date) as theWeek, 
       SUM (order_totalPrice) as totalSales 
    from  orders_tbl 
    where  order_date >= '01/01/2015' 
    group by DATEPART (YEAR, order_date), DATEPART (WEEK, order_date) 
    ) as mySourceTable 
    pivot 
    (
     sum (totalSales) 
     for theYear in ([2015], [2016], [2017]) 
    ) as myPivotTable 
    order by theWeek asc 

これは次のように結果を与える:

Week 2015 2016 2017 
    ---------------------------- 
    1  $999 $999 $999 
    2  $999 $999 $999 
    3  $999 $999 $999 

しかし、これは、特定の日に始まる7日であるとして「数週間」を定義その週の。 (私は月曜日がデフォルトだと思う)。

Day of Month Week # 
    ----------------------- 
    1-7    1 
    8-14   2 
    15-21   3 
    22+    4 

そして、私の最終的な出力は次のようになります:

私は本当に何をしたいのか

は、4週間後に毎月分割私は年間48「週」を持っているだろうというように、このようなものです

Month Week  2015 2016 2017 
    ---------------------------------------- 
    1  1   $999 $999 $999 
    1  2   $999 $999 $999 
    1  3   $999 $999 $999 
    1  4   $999 $999 $999 
    2  1   $999 $999 $999 
    2  2   $999 $999 $999 

私はこれが最もビジネス上の意味を持つため、これを実行したいと考えています。

これを達成するために上記のクエリを変更するにはどうすればよいですか?

規定1:これは、Webアプリケーションコード内から呼び出すクエリです(このため、これはT-SQLのいくつかの事項を除外していると思います...)?はい、Webアプリケーションコードを使用してさまざまなループやその他の操作を行いますが、純粋に単一のSQLクエリでこれを行う方法はありますか?

規定2:私はMS SQL 2008 R2を使用しています。

答えて

0

月を返すDAY関数を使用すると便利です。

DAY(order_date) AS DayOfMonth 

次あなたは次のように独自のロジックを構築することができます。これは素晴らしいです

CASE WHEN DAY(order_date) >= 1 AND DAY(order_date) < 8 THEN 1 
WHEN DAY(order_date) >= 8 AND DAY(order_date) < 15 THEN 2 
WHEN DAY(order_date) >= 15 AND DAY(order_date) < 22 THEN 3 
ELSE 4 END AS WeekNumber 
+0

!それは私が探している正確な結果を与える。 2つのフォローアップ質問:

1)SELECTとGROUP BYの両方でCASEを使用する必要がありますか? (これはMS SQLで必要とされているからです) 2)パフォーマンスを向上させるためにこのクエリを最適化する方法はありますか? –

関連する問題