ここに、変換アルゴリズムの疑似コードがあります。データセット全体を2回スキャンする必要があることに注意してください。たとえば、入力データをソートすることができる場合など、効率を向上させるその他の機会がいくつかあります。また、擬似コードなので、null値の処理を追加していません。
var columnNames = new HashSet<string> { "pn_id" };
foreach (var record in data)
columnNames.Add(record.question_id.ToString());
var table = new DataTable();
foreach (var name in columnNames)
table.Columns.Add(new DataColumn(name, typeof(string)));
foreach (var record in data)
{
var targetRecord = CreateNewOrGetExistingRecord(table, record.pn_id);
targetRecord[record.question_id.ToString()] = record.char_value ?? record.date_value.ToString();
}
そして、ここでヘルパーメソッドのスケッチです:Sybaseは、ピボット操作をサポートdoes't場合
DataRow CreateNewOrGetExistingRecord(DataTable table, object primaryKeyValue)
{
var result = table.Find(primaryKeyValue);
if (result != null)
return result;
//add code here to create a new row, add it to the table, and return it to the caller
}
することは、私はC#で、それを自分自身をコーディングしたいです。それほど複雑ではありません。 – phoog
あなたが表示するデータには、すべてのpn_idに独自のquestion_idsがありますが、question_id 152と他の質問との間には何らかの関係がありますか?または、300個の異なるquestion_idがある場合は、各行に300個のカラムが必要です。与えられたpn_idにその質問IDがない場合はnullを返します。 PIVOTキーワードを使用せずに、CASE文を使用して任意のSQLでピボットすることができます。 –
はい私はこのテーブルのレコードを列にデータを持ち、C#datagridviewの1つのレコードとして表示する他のテーブルと結合したいので、値が300の列を必要とします。この場合、CASEステートメントの使用方法を確認します。しかし、これまでのところ、このリンクが見つかりました。これは最初は問題を解決するはずですが、今晩後半にこれを使う予定です。 http://groups.google.com/group/sybase.public.sqlanywhere.general/browse_thread/thread/81792ce38b3817e2?pli=1 – MStp