0

パラメーター:@Year int, @Month int

環境: SQL Server 2008 R2、Visual Studio

選択した月と年に応じて、各コード タイプ (約 50 以上のタイプ) の 6 か月の平均を見つけるための統計レポートを作成します。

たとえば、2012 年 2 月を選択すると、2012 年 1 月、2011 年 12 月/11 月/10 月/9 月/8 月にコード タイプが表示されるたびにクエリがカウントされ、その合計を 6 で割って過去 6 か月の平均を取得します。実際の平均は、Visual Studio のデータセットで計算されます。

SQL コードは次のようになります。

CASE WHEN TypeCode = "xyz" and [Year] = (@Year - 1) and [Month] in (12, 11, 10, 
9, 8, 7) then 1 else 0 end as TypeXYZ_Jan_Avg,

CASE WHEN TypeCode = "xyz" and (([Year] = (@Year ) and [Month] = 1) OR 
([Year] = @Year and [Month] in (12, 11, 10, 9, 8)) 
then 1 else 0 end as TypeXYZ_Feb_Avg,

CASE WHEN TypeCode = "xyz" and ([Year] = @Year and [Month] in (11, 10, 9, 8, 7, 
6)) then 1 else 0 end as TypeXYZ_Dec_Avg

これは、50 以上のコード タイプごとに行われます。

この関数には、保持する必要がある他のフィールド (ここでは言及されていません) があります。とにかく、最終的なクエリは、許可されている列の最大数を超えています。

コード型をパラメーターにすることで、フィールドの量を最小限に抑えようとしました。

このようなもの:

CASE WHEN TypeCode = @CodeType and ([Year] = @Year and [Month] in (11, 10, 9, 
8, 7, 6)) then 1 else 0 end as Type_Dec_Avg

ただし、関数でパラメーターを宣言すると、これは機能しません@CodeType(VS で多値エラーが発生するため)。

 SELECT * FROM CodeTypes(@CodeType, @Year, @Month) 

値は渡されますが、計算はオフです:

 SELECT * FROM CodeTypes(@Year, @Month) WHERE CodeType in (@CodeType)

助言がありますか?たぶん、一時テーブルを作成しますか?私はこれを行う方法にあまり慣れていませんが、今いくつかの研究を行う予定です。

ありがとう。

4

2 に答える 2

1

月、年、コード、値の 4 つの列のみを生成するクエリの作成に取り組みます。このクエリは、最終的にははるかに単純であり、Visual Studio での処理もはるかに簡単であることがわかると思います。

于 2012-09-23T23:35:10.287 に答える
0

漠然としていますが、試してみましょう

   select c1.codeType, sum(c2.sales)/6
   from code c1 
   join code c2
   on c2.codeType = c1.codeType 
   and DateDiff(mm, c1.date, c2.date) <= 6 
   group by c1.codeType
于 2012-09-24T01:51:19.023 に答える