2017-11-07 37 views
2

SQL文でGROUP BYを使用して複数の行から1行を作成しようとしています。アクセス:複数の行を1つにまとめますが、テキストを表示

問題は、私が扱っている生データには、必要のないデータが含まれており、すべてのフィールドにテキスト文字列が設定されています。例えば

ID COURSE 
01 Baking 101 
01 Driving 102 
01 Writing 101 
02 Baking 102 
02 Writing 101 

私は、唯一の 'ベーキング' と '運転を' 'ライティング' を必要としません。だから私はこのように上げるために自分のデータが欲しい:私は、彼らは、関連するキーワードが含まれている場合見て、レコードを選択しています

ID Baking  Driving 
01 Baking 101 Driving 102 
02 Baking 102 - 

を私の生のデータソースは、ないものだけを全てのコースのコースの履歴が含まれているため、私が心配していること。また、コースのスペルは同じコースで異なる場合があります。

現在のところ、IIf文を使用して、キーワードが存在する場合は1を返し、存在しない場合は0を返します。私はそれと私のID(個人識別子)をGROUP BYで合計します。だから、私のテーブルはこのように少し変わった。レコードは、特定のキーワードが含まれている場合は、まだ単一の行にすべての関連レコードをグループ化し、切り捨てながら、私のクエリは、レコードを表示するために、私は希望何

ID Course1 Course2 Course3 Course4 Course5 
01 1  0  0  1  0 
02 0  1  1  0  0 

です。

GROUP BY関数では、テキスト文字列の処理方法がわからないため(つまり、表示するレコードがわからないため)、affを生成することができませんGROUP BYを許可するための数値。数字をテキスト(つまり、私のIIfステートメントを満たすテキスト)に変換する方法はありますか?

データの実際のサンプルを提供できないことをお詫びしますが、残念ながら共有することはできません。

編集:

1.Baking 101 Cse 
2.Baking 101 Course 
3.Baking-101 Cse 

だから今のように、私のSELECT文は、この

SELECT Courses.CourseName, 
Sumiif((Courses.CourseName Like "*Baking*",1,0) AS BAKING 
FROM Courses 
GROUP BY Courses.PersID 

のようなものです:

私は綴りが変化すると言ったときに私が意味することは、このようなものです私は1つ以上のコースを扱うので、これはかなり簡単です。

私が直面している問題は、IIf関数の結果ではなく、実際のデータをフィールドに表示したいということです。 1の代わりに、私はコースの名前を見たいと思う。しかし、私はまた、私は集約関数を使用する必要がある私の主キーでグループ化する必要があります。私は文字列でこれを行うことができる集約関数を認識していません。

+2

ダミーデータであっても、実際に表示したいクエリと結果を投稿できますか?これは、あなたが望むものをさらに理解するのに役立ちます。 –

+0

あなたの現在の質問には、_Baking 101_と_Baking 102_の関係を見る方法がないので、それらが同じ列に属することを知る方法はありません。すべての列名とその列に属する値を持つ表がある場合は、これをピボットで簡単に解決できます。それは現状では解決できません。 –

+0

「スペルが変わる可能性がある」とは何ですか?数字の接尾辞の変更だけですか?コース名とセクションは本当に別々のフィールドにあるべきです。ただし、文字列操作関数を使用してクエリ内のパーツを解析します。 – June7

答えて

0

のようなテーブルまたはクエリ考えてみましょう:

+----------+------------+---------------+ 
| CourseID | CourseName | CourseSection | 
+----------+------------+---------------+ 
|  01 | Baking  |   101 | 
|  01 | Driving |   102 | 
|  01 | Writing |   101 | 
|  02 | Baking  |   102 | 
|  02 | Writing |   101 | 
+----------+------------+---------------+ 

と問合せ:

TRANSFORM First(Courses.CourseSection) AS FirstOfCourseSection 
SELECT Courses.CourseID 
FROM Courses 
WHERE (((Courses.CourseName)<>"Writing")) 
GROUP BY Courses.CourseID 
PIVOT Courses.CourseName; 

出力:

+----------+--------+---------+ 
| CourseID | Baking | Driving | 
+----------+--------+---------+ 
|  01 | 101 |  102 | 
|  02 | 102 |   | 
+----------+--------+---------+ 

コース名がスペルと名前にはあまり一致している場合とをセクションは実際には1つのフィールドにありますが、セクションの接尾辞は一貫しており、次にクロス集計をエミュレートします。

SELECT Courses.CourseID, Max(IIf(InStr([CourseName],"Baking")>0,Right([CourseName],3),Null)) AS Baking, 
Max(IIf(InStr([CourseName],"Driving")>0,Right([CourseName],3),Null)) AS Driving 
FROM Courses 
GROUP BY Courses.CourseID; 
関連する問題