0

ここに初めて投稿します...フォーマットの問題をお許しください。問題の解決策を導き出すための同様の状況を何日も探し続けた後でも、私はまだルービック キューブの中にいることに気づきます。学生の試験成績と人口統計を示す「レポート」を作成しようとしています。シナリオは次のとおりです。

次の列を含む試験ソース テーブルがあります。

テーブル名: FOT2012PRE

ItemID int (主キー)
ItemNum nchar(10) (結果テーブルの対応する列名)
ItemStem nvarchar(1000) (これは質問ステムです。)
IC1 nvarchar(1000) (これは最初の回答の選択肢です。)
IC2 nvarchar(1000 ) (これは 2 番目の選択肢です。)
IC3 nvarchar(1000) (これは 3 番目の選択肢です。)
IC4 nvarchar(1000) (これは 4 番目の選択肢です。)
PriAns nvarchar(10) (これは正解の選択肢です。 - 人口統計項目には適用されません。)

グラフィック、ビデオ、コース、ユニット、デモフラグを識別する追加の列があります。

試験ソース テーブルのデータの一部を次に示します。

ItemID ItemNum ItemStem IC1 IC2 IC3 IC4 PriAns
1 Item1 現在の学年は?9年生 10年生 11年生 12年生 NULL
2 Item2 あなたの性別は?男性 女性 NULL NULL NULL

学生が各質問に答えると、その選択がその試験に固有の結果テーブルに記録されます。この結果テーブルには次の列があります。

テーブル名: FOT2012PRERESULTS

ResultsID int (主キー)
StudentID nvarchar(255) (試験を受ける各学生の一意の ID)
LastItem nvarchar(255) (各回答が処理されるたびに更新 - 試験の再エントリ用)
Item1 nvarchar(255) (Item1 の回答が記録されました: " C" 正解の場合、不正解の場合は選択肢)
Item2
nvarchar(255) (Item2 の回答が記録されます: 試験の他のすべての問題と同じです)

ここでは、結果テーブルのサンプル データをいくつか示します。

ResultsID StudentID LastItem Item1 Item2 Item3
743 MD911059935 67 IC2 IC2 C
744 IC2 IC2 C
746 MD911059949 67 IC2 IC2 IC4
934 MD3590986869 46 IC2 IC1 IC3

最終的には、レポートを次のように表示できるようにしたいと考えています。

項目:あなたの現在の学年は?

9 年生 (IC1 の回答数)
10 年生 (IC2 の回答数)
11 年生 (IC3 の回答数)
12 年生 (IC4 の回答数)
無回答 (NULL の回答数)

これらの結果はテーブルの形式を取り、地域、地区、州、および国ごとに結果を比較しますが、対応するネストされたクエリを実行してそれを処理できます。このソリューションについては、多くの州と何千人もの学生にまたがる約 40 の試験があるため、おそらくストアド プロシージャとして実装するのが最善であると考えています。必要に応じて、テーブル名やその他の値を渡すことができます。レポートへのアクセスは、特定のクラスで実施された試験に基づいて個別化されています。

ご支援やご提案をいただければ幸いです。結合またはピボットに関する具体的な情報を提供していただけるよう、よろしくお願いいたします。私は恐竜で、ASP JavaScript でプログラムしています。これまでのところ、その道をたどる試みは、私をこの立方体の中に入れただけです...そして、抜け出すには光が必要です。私が何かを省略した場合は、お知らせください。

ありがとうございました...

アップデート:

データを 1 つのテーブルに正規化するために作成した SP の一部を次に示します。

Create Table #rawtemp 
( 
Choice nchar(5),
ChoiceCount float
)

Create Table #temp 
( 
Item nchar(5),
Choice nchar(5),
ChoiceCount float
)
-- Query the results table and tally by response

while (@i <= 8)
begin
SET @examcolinc = cast(@i as varchar(2)) -- ループに基づいてインクリメント
SET @examcol = @res2+@examcolinc -- インクリメントを追加してインクリメンタル列名を作成 - 基本値は「アイテム」という言葉

Declare @xsql nvarchar(1000) --this query cycles through each unique column in the results table, counting and grouping according to each response
Set @xsql = 'Select '+@examcol+' AS Choice, Count(*) AS ChoiceCount FROM dbo.'+@pretest+' WHERE '+@examcol+' <> '''' AND StudentID LIKE '''+@st+''' Group By '+@examcol

-- Exec (@xsql) -- 生の集計を一時テーブルに格納する#rawtemp を
挿入する Exec (@xsql) #temp
を挿入する -- 増加する列名 (Item1、Item 2 など) を示す
(
Item
)

(
@examcol
)

SET @i = @i+1 --increment the loop by one
end <br>

クエリの結果は次のとおりです。
Choice ChoiceCount
IC1 323
IC2 154
IC3 34
IC4 20
IC1 275
IC2 244
IC1 423
IC2 62
IC3 10
IC4 7
...

#temp 挿入の結果は次のとおりです。
Item Choice ChoiceCount
Item1 NULL NULL
Item2 NULL NULL
Item3 NULL NULL
Item4 NULL NULL
Item5 NULL NULL
Item6 NULL NULL
Item7 NULL NULL
Item8 NULL NULL

それらを結婚させようとしているだけです...一時テーブルに値として挿入する必要があるのは列の「名前」であるため、それを理解しようとして頭を悩ませてきました。どんな助けでも大歓迎です。上記の一時テーブルが別の一時テーブルにフィードされている可能性があります。この一時テーブルは最終的に試験ソース テーブルと結合されるため、質問のステム、ディストラクタ、ユニット番号、および関連するベンチマーク/標準を取得できます。

4

1 に答える 1

0

次のように一時テーブルを作成します。

ExamId (exam source table name, eg 'FOT2012PRE') 
ItemNum (from exam source table, eg 'Item1') 
StudentId (eg 'MD911059935') 
Response (eg 'IC1', or NULL)
  • 複数の学校がまったく同じ「examId」を使用している場合は、列を追加して学校を区別します

これにより、一意の試験/質問番号/回答した学生ごとに 1 つの行が得られます。

このテーブルに入力するには、試験ソース テーブルをループします。各行の ItemNum フィールドには、結果テーブルの列名の 1 つが含まれています。結果テーブルから、studentId + 対応する結果列の値 ("IC4" を含む Item2 など) を取得し、それらを一時テーブルに格納します。

現在使用している構築済みクエリでは、次のことはできません。

Set @xsql = 'Select ''' + @examcol + ''' as Item, '+@examcol+' AS Choice, Count(*) AS ChoiceCount FROM dbo.'+@pretest+' WHERE '+@examcol+' <> '''' AND StudentID LIKE '''+@st+''' Group By '+@examcol
于 2013-04-09T17:09:56.917 に答える