2

再び人々を悩ませて申し訳ありません。インターネット全体を検索しましたが、問題の解決策が見つかりません。Access に 2 つのテーブルがあり、出力は次のようになります。

数学 5
英語 3
英語2
物理5
数学1
数学 3

私はそれが欲しい:

数学 5、1、3
英語3、2
物理5

どうすればこれを達成できますか? Access データベースで SQL コマンドを試してみましたが、何も機能しません。また、ASP.NET で GridView を使用して解決策を探しましたが、運もありませんでした。これを達成する方法はありますか、それとも別のアプローチを取る必要がありますか?

私ができる最善の方法は GROUP BY であるため、出力は次のようになります。

数学 5
数学 3
数学1
物理学 3
物理1
...
4

4 に答える 4

2

簡単な解決策があります。last()クエリで集計関数を使用します。

サンプル:

SELECT RecNo, Last(fConcat([RecNo],[Field5])) AS Field5 FROM myTable GROUP BY RecNo; 

関数 Last() は、グループ化されるレコードごとに関数 Concat を呼び出します。関数 Concat の外で定義されたグローバル変数を使用することに注意してください。

以下は、概念実証としての単純なコードです。

Option Compare Database

Dim glbWert1 As Variant, glbWert2 As Variant

Public Function fConcat(strWert1, strWert2) As Variant

  If strWert1 <> glbWert1 Then
    glbWert1 = strWert1
    glbWert2 = strWert2
  Else
    glbWert2 = glbWert2 + "; " + strWert2
  End If

  fConcat= glbWert2

End Function

ソリューションは非常に高速に機能します

于 2012-05-15T16:02:12.157 に答える
2

私はあなたがこのようなものを探していると信じています -

オブジェクトのコレクションをカンマ区切りの文字列に結合

質問のGROUP BYで行ったようにデータを引き戻し、asp.netコードの各サブジェクトの数値を連結する傾向があります。

または、Access で使用する VBA 関数を作成して実行することもできます。1 つはすでにAllen Browne によってここに書かれています。Access 内のモジュールにコードを追加するだけで、Access 内の SQL クエリ内でその関数を使用できます。

このテーブル構造を考えると

subjects table 

id  |  SubjectName  |    Grade
---------------------------------
1      MATH            5
2      ENGLISH         3
3      ENGLISH         2
4      PHYSICS         5
5      MATH            1
6      MATH            3

VBA関数を使用した次のSQL

SELECT 
    subjects.SubjectName + ' ' + 
    ConcatRelated("Grade","subjects","SubjectName='" & SubjectName & "'") AS result
FROM 
    subjects
GROUP BY
    subjects.SubjectName

次の結果が得られます

result
------------
ENGLISH 3, 2
MATH 5, 1, 3
PHYSICS 5

質問で指定した順序を取得したい場合は、順序付けを行う別のフィールド/式が必要になります

于 2009-07-07T22:36:25.790 に答える
0

このタスクを解決するためにMSAccessとASP.Netがあれば、ネストされたリピーターのルートを使用します。

したがって、データベースを2回呼び出します。最初の呼び出しは、個別のカテゴリ(この場合はIDSUBJECTS)を取得し、2番目の呼び出しは、すべてのIDSUBJECTSのすべてのGRADEフィールドを取得します。ユーザー名でそれを行っている場合は、それらの各呼び出しにユーザー名を追加します。

次に、1つのリピーターを個別のIDSUBJECTSに結び付け、リテラルコントロールとリピーターをに配置しitemtemplateます。次に、リテラルコントロールからテキストを取得し、Repeater_ItemDataBoundイベントの内部リピーターへの参照を取得し、外部リピーターのIDSUBJECTに基づいて2番目のテーブルをフィルター処理します。内側のリピーターで、フィルター処理されたデータを繰り返し処理し、希望どおりに表示します。

最も簡単な解決策ではありませんが、機能する可能性があります。

SQL Server(Microsoft SQL Server Expressは無料でダウンロードできます)をお持ちの場合は、PIVOT関数を調べてみてください。

于 2009-07-07T22:04:41.140 に答える
-1

Microsoft SQL Server がオプションである場合にこれを処理する非常に興味深い方法は、共通テーブル式クエリを使用することです。CTE を使用すると、成績列をクラスごとに 1 つのセルに連結できます。Simple-Talk には、SQL 連結へのさまざまなアプローチを説明し、CTE の使用例を示す非常に優れたウォークスルーがあります (WITH ステートメントを探してください)。

Microsoft SQL Server をお持ちでない場合は、Microsoft SQL Server 2008 Expressをダウンロードしてください。

于 2009-07-07T22:22:38.860 に答える