2017-10-11 19 views
0

月曜日から始まる週のすべてのレコードを返すクエリがあります。私は成功のない週の毎日のレコード数を取得しようとしています。SQL - 毎週のレコード数を取得する方法

元のクエリ:私はグループ化とカウント(日時)を含むいくつかのことを試してみた

SET DATEFIRST 1 -- Beginning of week is Monday 
SELECT DateTime, ScanPoints, PostPoints 
FROM SmartTappScanLog 
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND UserID = '1' AND BeerID = '3' 
    ORDER BY DateTime ASC 

SET DATEFIRST 1 -- Beginning of week is Monday 
SELECT Count(DateTime), ScanPoints, PostPoints 
FROM SmartTappScanLog 
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND UserID = '1' AND BeerID = '3' 
    ORDER BY DateTime ASC 
    GROUP BY DateTime 

エラーがGROUPの近くに構文エラーがあることを示しています。

+1

... GROUP BY ... ORDER BY ... – jarlh

答えて

1

(未テスト)

SET DATEFIRST 1 -- Beginning of week is Monday 

SELECT Count(DateTime), ScanPoints, PostPoints 
FROM SmartTappScanLog 
WHERE DateTime >= 
     dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND DateTime < 
     dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND UserID = '1' AND BeerID = '3' 
GROUP BY DateTime 
ORDER BY DateTime ASC 
0

グループで注文する前に表示されます。

あなたのクエリは以下のように構築する必要があります:

SET DATEFIRST 1 -- Beginning of week is Monday 
SELECT datepart(dw, DateTime) as Day, ScanPoints, PostPoints, Count(DateTime) as Recs, 
FROM SmartTappScanLog 
WHERE DateTime >= dateadd(day, 1-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND DateTime < dateadd(day, 8-datepart(dw, getdate()), CONVERT(date,getdate())) 
    AND UserID = '1' AND BeerID = '3' 
    GROUP BY datepart(dw, DateTime) , ScanPoints, PostPoints 
    ORDER BY datepart(dw, DateTime) , ScanPoints, PostPoints 
0

をこれを試してみてくださいあなたのクエリは、いくつかの問題、

  1. GROUP BYを持っていますORDER BYの前に来なければなりません。選択
  2. 非集計列はまた、私はあなたの列のDateTimeを実際の日付と時刻が含まれていると句

    SELECT Count(DateTime), ScanPoints, PostPoints... 
    GROUP BY ScanPoints, PostPoints 
    
  3. 、GROUP BYでなければなりません。グループ化これにより、データ内の固有の日付/時刻値ごとのレコードが得られます。毎日のデータが必要なので、日付に変換して時間を取り除く必要があります。ちなみに、DateTimeはデータ型で、列のひどい名前です。

  4. すべての日付関数に等しく影響するわけではないので、私はDATEFIRSTを使用しないことをお勧めします。後で数週間で日付表記を使用すると、結果が間違っている可能性があります。

私の会社では、月曜日を週の開始として使用しています。シフトされた第1曜日を計算することにより、日曜日が属する週を変更することができます。あなたの週のフィルタリング/グループ化のためのFirstDayOfWeekIsMonday列を使用して

CAST(DATEADD(DAY, 
      (DATEPART(WEEKDAY, [YourDate]) + 5) % 7 * -1, 
      [YourDate]) 
    AS DATE) AS FirstDayOfWeekIsMonday 

は日曜日が前に月曜日に関連付けられていることを確認します。

追加のボーナスとして、この式はSARGableであり、YourDateのインデックスも引き続き使用できます。

+0

Recsの後にカンマを削除しました。クエリは、依然として、各レコードの行を特定の日に返します。 1日のレコード数が1行ではありません。私はそれを見続けるだろう。 –

+0

私はあなたがそれと一緒に働いているデータ構造を知っていませんscanpontsとdatapointsフィールドが繰り返す項目を引き起こしている可能性があります、あなたはそれらをselectとgroup by節から取り除くことができます – RegBes

関連する問題