2009-07-07 4 views
2

もう一度人を気にして申し訳ありません。私はインターネット上のすべてを検索したが、私の問題の解決策を見つけることができない。私はAccessで2つのテーブルを持っており、出力は次のようである:データベース(MS Access)またはサーバー側コード(ASP.NET)のレコード値を連結する

 
MATH 5 
ENGLISH 3 
ENGLISH 2 
PHYSICS 5 
MATH 1 
MATH 3 

は、私はそれになりたい:

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

どのように私はこれを達成することができますか?それはAccessデータベースでSQLコマンドで再生しようとしましたが、何も動作しません。私はまた、ASP.NETでGridViewを使用して解決策を探しましたが、運はありません。これを達成する方法はありますか?それとも別のアプローチをとるべきですか?

私にできるベストので、出力は次のようになり、GROUP BYである:私はこのタスクを解決するためのMS AccessやASP.Netを持っていた場合

 
MATH 5 
MATH 3 
MATH 1 
PHYSICS 3 
PHYSICS 1 
...
+1

非常に高速に動作しますが、以下の情報を提供していただけます。どのようなツールを使用するのが快適ですか(私はあなたがMS Accessを持っていることを理解していますが、ASP.Netも使えますか?GridViewの概念がどこにあるのですか?) – Eugene

+0

ここでは簡単に理解できるようにペイントして示します: http: //img195.imageshack.us/img195/7352/asdasdnyc.jpg 私はASP.NETでこれをやっています。私はSQL(複数のクエリ)を使用するか、ASP.NETのGridViewで何とかしてこれを達成したいと思います。 –

+0

5、1、3を別々の列に入れるか、sqlでコンマ区切りのリストを作成しますか? –

答えて

0

、私は、ネストされたリピータのルートを取ると思います。

私はデータベースへの2回の呼び出しを行い、最初に別々のカテゴリ(IDSUBJECTS)を取得するためにコールします.2番目の呼び出しは、すべてのIDSUBJECTSのすべてのGRADEフィールドを取得することです。あなたがUsernameでそれをやっているのであれば、それらの呼び出しのそれぞれにUsernameを追加します。

次に、1つのリピータを別のIDSUBJECTSに接続し、リテラルコントロールとリピータをitemtemplateに配置します。次に、リテラルコントロールからのテキストとRepeater_ItemDataBoundイベントの内部リピーターへの参照を取得し、外側のリピーターのIDSUBJECTに基づいて2番目のテーブルをフィルター処理します。内側のリピータでは、フィルタリングされたデータを繰り返し、必要な方法で表示します。

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

SQL Serverをお持ちの場合(無料でMicrosoft SQL Server Expressをダウンロードできます)、PIVOTの機能を調べることができます。

-1

Microsoft SQL Serverがオプションである場合、これを処理する非常に興味深い方法は、Common Table Expressionクエリを使用することです。 CTEを使用すると、学年の列をクラスごとに1つのセルに連結することができます。 Simple-Talkは、SQL Contacenationへのさまざまなアプローチを説明し、CTEの使用例を示しています(WITHステートメントの検索)。walkthroughです。

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

2

は、私はあなたがこのような何かを探していると信じて -

Join collection of objects into comma-separated string

私はあなたの質問にGROUP BYあなたに行ったようバックデータを引っ張って傾け、その後数の値を連結することでしょう

あなたのasp.netコード内の各科目のために。

また、Accessで使用するVBA関数を記述することもできます。 1つはすでにAllen Browne hereによって書かれています。 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 

を生み出しますあなたの質問に指定されている場合は、注文する

+0

ASP.NETからAccess VBA関数を実行するにはどうすればよいですか? –

+0

Access内のユーザー定義のVBA関数にアクセスできないJETデータベースに対してADO.NETコマンドが実行されるため、.NETからAccess VBA関数を実行することはできません。 SQLコマンドで使用できる唯一の機能は、次のとおりです。 - 「Jet 4.0でのサンドボックスモード操作の使用」セクションのhttp://support.microsoft.com/default.aspx?scid=kb;en-us;294698&Product=accサービスパック3以降。推奨されているように、OPがASP.NETで最終結果を必要とする場合、私は、OPが質問で定義した返された結果セットの連結を行うためのメソッドをサーバー側コードに持たせます。 –

2

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

サンプル:最終

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

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

次は、概念実証として、単純なコードです: 1. Accessテーブル構造 2:

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 

ソリューションは

+0

このソリューションを使用する場合、この関数を使用してクエリを実行する前に、識別子(strWert1)**で順序を決定することが非常に重要です。私はエラーを受け取り、DBMSがフィールドをこの関数に送った順番にトレースしました。しかし、ありがとう。 – pgee70

関連する問題