1

わかりました私は動的列のアイデアを熟考してきました.これが意味するのは、名前の付いた列のテーブルJanuaryですDecember.

ユーザーは実行時にtoなどの月の範囲を選択します。FebJuly

私が通常行うことは、コード ビハインドからすべての列を取得し、必要なものとそうでないものを並べ替えることです。

しかし、これをすべてSQLで行う方法を考えていました。

SQLが配列をサポートしていないことは知っていますが(悲しい顔)、代替手段があります。

私の質問は、列名の範囲であるパラメーターに応じて、いくつかの列を動的に選択する SQL クエリを設定する方法はありますか?

いくつかの動的クエリを見てきましたが、それらは 1 列しか実行しません。

私は、コードビハインドによって提供された列の文字列をSQLの1つのパラメーターとして渡し、その後、何らかの方法で反復して各列を選択するという方針に沿って考えています。

皆さんはどう思いますか?できませんか?できますが、面倒ですか?

EDIT:ピボットクエリを適用して列の範囲(月)を取得することがわかるように、いくつかのコードを提供すると思いました。これまでに提案されているのは、まず正規化してからピボットすることです。

SELECT
   [1] January ,
   [2] February,
   [3] March,
   [4] April,
   [5] May,
   [6] June,
   [7] July,
   [8] August,
   [9] September,
   [10] October,
   [11] November,
   [12] December
   FROM
(
  SELECT MONTH(Convert(datetime,[lasttaken],120)) as months, complete
  FROM #Temp WITH(NOLOCK)
) d
pivot 
(
   count(complete)
   for months in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10],[11],[12])
) p 
4

3 に答える 3

4

これを行う方法はありますが、テーブルを再構築する必要があります。
あなたの問題は、(月)列名がメタデータであり、それらを見たいということです

それ以外の

year | Jan | feb | Mar | Apr | etc  
2013 | 10  | 9   | 11  | 4   | 0

実際のデータとして。

やりたいことは、月の列を作成し、データを正規化して次のようにすることです。

year | month | data
2013 | 1     | 10
2013 | 2     | 9
2013 | 3     | 11
2013 | 4     | 4

これで、月ごとにデータをクエリできます。

これは、希望する方法でデータをクエリできるようにするために、データ設計にアプローチする必要がある方法です。

お役に立てれば。

于 2013-08-15T11:13:24.123 に答える
2

また、データを正規化された形式 (月ごとに別の行) で保存することの問題点は何でしょうか? 次に、特定の範囲を取得する場合は、where句を使用します。

SQL Server は、pivot行の値を列に簡単に挿入できる機能を提供します。

于 2013-08-15T11:05:08.983 に答える
0

ステートメントに渡すことで、必要な列を含む動的SQLステートメントを作成できますEXECUTE(@query)。例えば

Execute ('select Jan, Feb, Mar from Table')

他の人が示唆しているように、テーブルを正規化し、where句を実行して特定の期間のレコードを選択する必要があります。

于 2013-08-15T11:16:47.610 に答える