2016-05-26 14 views
0

ことで、私は次のようしているSQLクエリ:SQLグループ条件

SELECT CASE 
      WHEN CAST(tDate as DATE) < CAST(GETDATE() as date) -- if older then Today 
      THEN DATEADD(dd,-1,CAST(GETDATE() as date))  -- assgin yesterday's date 
      ELSE CAST(tDate as date)       -- use the date 
     END as tDate, 
     SUM(tDuration-ISNULL(tDone,0)) as tToDo FROM tTable 

    WHERE .....conditions..... 

    GROUP BY tDate 
    ORDER BY tDate 

私はそれには二つの問題があります:私は成功する

私は昨日までにSUM()に過去のタスクの期間のすべてを試みたが、しかし、GROUP BYはそれらを1つの日付に合計しません。別々の行に残ります。なぜ私は日時入力を今日までキャストして、それらが等しい値を持つべきかわからない。

CASTの代わりにCONVERTを使用し、処理をサブクエリに分割して改善しませんでした。

+2

項目#1の場合、あなたは時間コンポーネントなしでグループ化したいならば、あなたは同様にあなたの 'GROUP BY'でそのロジックを持っている必要があります。それ以外の場合は、SQLに 'tDate'全体をグループに分割するように指示しています。それが忠実に実行されます。また、どのRDBMSを使用していますか?タグを付けてください。 –

+0

トム、これは正しいです、私は何とかそれを忘れました。テストされ、それは動作します。 –

答えて

1

これであなたのクエリを置き換えます

SELECT CASE 
      WHEN CAST(tDate as DATE) < CAST(GETDATE() as date) -- if older then Today 
      THEN DATEADD(dd,-1,CAST(GETDATE() as date))  -- assgin yesterday's date 
      ELSE CAST(tDate as date)       -- use the date 
     END as tDate, 
     SUM(tDuration-ISNULL(tDone,0)) as tToDo FROM tTable 

    WHERE .....conditions..... 

    GROUP BY CASE 
      WHEN CAST(tDate as DATE) < CAST(GETDATE() as date) -- if older then Today 
      THEN DATEADD(dd,-1,CAST(GETDATE() as date))  -- assgin yesterday's date 
      ELSE CAST(tDate as date)       -- use the date 
     END 
    ORDER BY tDate