2012-03-16 11 views
3

SQLデータベース(一部のグループはSQL ServerやOracleなど)を使用してCSVにデータをエクスポートする必要があります。 。SQL:結合されたテーブルのIDを文字列に集約する

たとえば、私はクラスのテーブルと学生のテーブルを持っています。クラスからはID、名前、セクション、時間が必要で、生徒からはクラスの生徒のID列が必要です。結果は列id、name、section、time、student_idsを返します。そこにできた、

"1405,Computer Science,101,12-1:30,'32,43,53,12,41'" 

クラスあたりの生徒数は一貫していない:行出力のようなものになってしまうでしょう

'32,43,53,12,41' 

:「student_ids」列は、次のような区切り文字列、でなければなりません1人の学生、または20人の学生である。私は、このデータを取得するためにSQL Serverを使用するwhileループや、キーを集約する一時テーブルを使用することを考えましたが、これを達成するための標準SQLを使用する方法があるかどうかを知りたいので、スクリプトを移植することができます。

注:私は出力形式が理想的ではないことを知っていますが、唯一の選択肢は、各クラス/生徒のコンボごとに異なるレコードを取得しなければならないということです。

+0

どのような種類のSQLですか? MySQLには例えばGROUP_CONCAT()があります。また、生成された後、これをどのように使用しますか?私たちは代替プロセスを提供できるかもしれません。 – MatBailie

+0

@Dems残念ながら、SQLの種類は、ほとんど常にOracleまたはSQL Serverのいずれかのバージョンで異なりますが、 –

+0

@Demsまた、「class_student」のような追加エクスポートを使用して、標準形式でデータを受け取る方法としてエクスポートを使用していますオプションではありません –

答えて

2

異なるRDBMSには、この種のクエリを実行するさまざまな方法があります。

MySQLを使用している場合は、GROUP_CONCAT集約関数を参照してください。

Firebirdには、LIST集合関数があります。

SQL Serverを使用している場合は、の下にSOという回答のある質問があります。通常の方法は、FOR XML PATH構造を使用しています。良い例は次のとおりです。SQL Query to get aggregated result in comma seperators along with group by column in SQL Server

オラクルでこれを行う方法はいくつかありますが、良い記事はhereです。

0

あなたの質問に対する答えは:いいえ、標準SQLでは実行できません。

これは、1つのフィールドに複数の値を入力しようとしているためです。これは、最初の正規形の違反です。

標準以外のSQLを使用しても構いませんが、データベースごとにSQLは異なります。

ただし、SSRSのtablix(同じ標準SQLを使用してOracleとSQLServerの両方のテーブルにアクセスすることもできます)を使用して行うこともできます。

1

それはSQL Serverのなら、私はこのようにそれを行う傾向にある。

SELECT c.classID, c.other columns, 
STUFF((SELECT ',' + convert(varchar,StudentID) 
    FROM StudentClass sc where c.ClassId = sc.ClassID 
    FOR XML PATH('')),1,1,'') as StudentIdList 
from ClassTable c 

これは、あなたがClassIdのIDともStudentIdClassIdの両方が含まれているStudentClassリンクテーブルを持っているClassTableを持っていることを前提としています。

EDIT:学生とクラスの情報の両方を持つテーブルがあるため、2つのテーブルがリンクされている必要があります。リンクテーブルのいずれか、または各生徒に1つのクラスのみが許可されている場合は、ClassIdがstudentテーブルに格納されている可能性があります。いずれにしても、上記はあなたの問題を解決するのに役立ちます。

関連する問題