2016-08-17 3 views
-1

今日が今日と等しい場合にのみ計算される3週間の平均を作成する必要があります。基本的にコードは以下のように動作しますが、もちろん以下のコードは正しくありません。キーワード「ELSE」の近くに誤った構文があることを示しています。どんな指導も驚くべきものです。 "変数名" とケース3の複数回のSQLを使用した3週間の予告

CASE WHEN 
*Variable Name(Date)* = GETDATE() 
THEN 
CASE WHEN *Variable Name(Date)* >= GETDATE()-21 AND *Variable Name(Date)* < GETDATE() 
THEN 
SUM(*Variable Name(Minutes)*/3 ELSE 0 END AS ThreeWeekAvg 
+0

をのGetDateに等しいの両方になるだろう* *変数名(日)された方法は、 ()**および** GetDate()より小さい? – Blorgbeard

+0

@blorgbeardまず、今日がGetdate()であることを特定する必要があります。一度それが知られている、第二の部分はgetdateの直前までのgetdateの21日前の日付を取って、それらを平均することです。最初の部分を削除すると、getdateにのみ必要なときに、すべての日付に3週間の平均が与えられます。 –

+0

あなたの疑似コードは混乱します。小さなサンプルテーブルと期待される出力を投稿できますか?それはおそらくあなたが望むものを明確にするためのより簡単な方法でしょう。 – Blorgbeard

答えて

0
select 
    ... 
from 
    <your table> t 
    cross apply (
     select sum(minutes)/3e as ThreeWeekAvg 
     from <your table> t2 
     where 
       t.<date> = cast(getdate() as date) 
      and t2.<date> >= dateadd(day, -21, t.<date>) 
      and t2.<date> < t.<date> 
    ); 

私はあなたが列の話をしていると推定。新しいバージョンのSQL Serverでsum() over (range ...)を使用することもできます。

私はそれ以上私の試みが有効と考えていますが、ここにあなたがしようとしていた理由に近くに見える副問合せを持つ別のアプローチです:

select 
    ... 
    case when *Variable Name(Date)* = getdate() then (
     select sum(*Variable Name(Minutes)*)/3e 
     from ... 
     where *Variable Name(Date)* >= getdate() - 21 and *Variable Name(Date)* < getdate() 
    ) as ThreeWeekAvg 
from 
    ... 
関連する問題