0

これは本当に私を困惑させますが、答えが目に見えないところに隠れているだけで、厄介なバグが見えないのかもしれません. しかし、繰り返しになりますが、私は DBA ではありません。数千のレコードをプルする代わりに、数か月のレコードをロールアップする、より複雑な SQL を作成する方法を学ぼうとしています。そうすれば、バックエンドでそのデータを集約して、クライアントエンドの負荷を軽減できます。

データベースから数年分のデータを選択し、毎月別のテーブル内の独自のレコードにロールアップしたいと考えています。つまり、1 年のうち 12 か月間、最大で 12 レコードを保持する必要があります * 選択した年数。

これは私の考えでは単純に思えます。日付範囲を選択し、DATEPART(MM, ) を使用する月ごとにケースアウトします。次に、単純な COUNT()、AVG()、および ETC 関数を使用して、case ステートメントの外側でそのデータを月にロールアップします。

しかし、それはうまく機能していません。では、どのようにしてデータの範囲を選択し、複数の列を月ごとに 1 つのレコードに集約し、1 つの select ステートメントで何年ものデータを処理するのでしょうか? 1 か月を簡単に要約する 1 つの select ステートメントでこれを行うことができます。

このコードは、私が望むすべてを行います。これを、その年のうち毎月同じようにできるようにする必要があるだけです*私が申請したい年数。

DECLARE @StartDate Date='2013-01-01'
DECLARE @EndDate Date='2013-02-01'

SELECT @Name, 
    @StartDate, 
    COUNT(a.[CODE]),
    SUM(a.[TICKETS]),
    AVG(a.[TICKETS]),
    COUNT(CASE WHEN a.[FLAG1] = 'A' THEN 1 ELSE NULL END),
    COUNT(CASE WHEN a.[FLAG1] = 'B' THEN 1 ELSE NULL END),
    COUNT(CASE WHEN a.[FLAG1] IS NULL THEN 1 ELSE NULL END)
FROM [SOMETABLE] a
WHERE a.[CODE] = @Name
AND a.[DATE] >= @StartDate
AND a.[DATE] < @EndDate
4

1 に答える 1