2017-08-29 33 views
0

人をモデル化するデータベースのクエリを書き込もうとしています。これらの人々は組織内のポジションを保持しているため、ポジションテーブルに複数のエントリがあります。私はまた、電子メール、アドレス、および電話の情報を保持するテーブルから参加しました。MS SQL Server複数の行を1つに結合するクエリ

私はこのような元のクエリを持っています。

SELECT 
    P.ID 
    , N.FIRST 
    , N.MIDDLE 
    , N.LAST 
    , A.AD1 
    , A.AD2 
    , A.AD3 
    , A.CITY 
    , A.STATE 
    , A.ZIP 
    , A.COUNTRY 
    , PH.NUMBER 
    , PH.TYPE 
    , E.TYPE 
    , E.ADDRESS 
FROM 
    PERSON AS P 
    JOIN NAME AS N ON P.ID=N.ID, 
    JOIN ADDRESS AS A ON P.ID=A.ID, 
    JOIN PHONE AS PH ON P.ID=PH.ID, 
    JOIN EMAIL AS E ON P.ID=E.ID 

Iの代わりPOSITIONからPOSITIONテーブルの行ごとに別々の行に出てくる元のクエリを引き起こす参加、私はたい各列に対しての、このクエリにPOSITIONテーブルに参加したいですクエリの行に追加します。

位置テーブルのクエリは、最初のクエリから返された各行の単なるものです。select * from Position as Pos where Pos.ID={P.id}ここで、P.IDは最初のクエリのものです。

正常な結果は次のようにする必要があります:あなたはオーダーのアイテムを注文レコードに参加すると思うだろうかの

enter image description here 種類。私はこれが組合でなければならないと思っています。

が、私はちょうど位置テーブルは、このようなものです参加したときに、私は何を得る:

enter image description here

これは可能ですか?日を探していた。

+0

サンプルデータ、あなたが試したものなどを投稿してください。このリンクはあなたに役立ちます:https://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-フォーラム/ – Eli

+2

'私は、'あなたは列を意味する行ごとに別の行で出てくるクエリを理解していないのですか?いくつかのデータサンプルと期待される結果を追加してください – Horaciux

+0

はい、可能です。それは、[カンマで区切られたリスト]のような値を持つPositionの単一の列を必要とするかどうかによって異なります(https://stackoverflow.com/questions/17591490/how-to-make-a-query-with-group- concat-in-sql-server)、またはPosition1、Position2などのように[各位置の新しい列](https://stackoverflow.com/q/14797691/6167855) Horaciuxは、サンプルデータと期待される出力を述べました。いずれにせよ、あなたの質問は、私のコメントにリンクされている2つのうちの1つの複製です – scsimon

答えて

0

それは以下のようなものであると仮定し、参加条件と列名がわからない、これを試してください:あなたが唯一の一人一人

SELECT *, SUBSTRING(POS_TITLE,0,CHARINDEX(',',POS_TITLE,0)) as POS1_Title, SUBSTRING(POS_TITLE,CHARINDEX(',',POS)+1,LEN(POS_TITLE)) as POS2_Title 
FROM 
(
SELECT 
    P.ID 
    , N.FIRST 
    , N.MIDDLE 
    , N.LAST 
    , A.AD1 
    , A.AD2 
    , A.AD3 
    , A.CITY 
    , A.STATE 
    , A.ZIP 
    , A.COUNTRY 
    , PH.NUMBER 
    , PH.TYPE 
    , E.TYPE 
    , E.ADDRESS 
    ,STUFF(
    (SELECT ','+title FROM POSITIONS as P WHERE P.PositionId = N.PositionId FOR XML PATH('')),1,1,'') as POS_TITLE 
FROM 
    PERSON AS P 
    INNER JOIN NAME AS N ON P.ID=N.ID, 
    INNER JOIN ADDRESS AS A ON P.ID=A.ID, 
    INNER JOIN PHONE AS PH ON P.ID=PH.ID, 
    INNER JOIN EMAIL AS E ON P.ID=E.ID 
    INNER JOIN POSITIONS AS N ON N.ID = A.ID 
GROUP BY P.ID 
    , N.FIRST 
    , N.MIDDLE 
    , N.LAST 
    , A.AD1 
    , A.AD2 
    , A.AD3 
    , A.CITY 
    , A.STATE 
    , A.ZIP 
    , A.COUNTRY 
    , PH.NUMBER 
    , PH.TYPE 
    , E.TYPE 
    , E.ADDRESS 
) as A 
ための2つのポジションのタイトルを持っている--assume個々の列の

UPDATEを

+0

これは機能します!私はそれをすべての柱のために行くことができますが、質問です。カンマで区切ったリストを作成する代わりに、各タイトルごとに個別のフィールドが必要な場合はどうすればよいでしょうか? –

+0

申し訳ありませんが、お望みの出力に気付かなかった。 'PIVOT'または' CASE WHEN'文が必要になるでしょう。私はそれに取り組んでいます。 – LONG

+0

ああありがとう!すぐに勉強しています。 –

関連する問題