1
すべて、

SQL CONCAT IFステートメント?

イム私は私の次のクエリを解決する必要があるかわからないし...私はSQLサーバーで目的のレコードを引き戻す次のクエリを持っている...

SELECT agenda.AgendaItemNumber,Agenda.AgendaName, AgendaType.AgendaTypeDescription, userdetails.fullName 
FROM Agenda 
JOIN AgendaType ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
JOIN UserDetails ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND AgendaItemNumber = AgendaItemNumber 
AND AgendaName = AgendaName 
AND AgendaTypeDescription = AgendaTypeDescription 
AND AgendaItemNumber >= '3' 

モーニング

上記クエリが機能しますが、私はこれをわずかに強化する必要があります。それは私がやりたいどのような基本的に「フルネーム」列を除き、重複レコードあり、次の結果、...

Results_image

を引き戻すと、そのように、このクエリにいくつかの余分なコードを追加することが可能です私はクエリを実行するとき、私は 'AgendaItemNumber'ごとに1つのレコードを表示し、このレコードのフルネームの両方を連結することができます。しかし、私は追加されたAgendaItemsNumbersには、このテーブルに1つのユーザーフルネームが割り当てられているだけです。そのイメージファイル内のこれらのいくつかのレコードだけで私は何か賢いことをする必要があります。

多分、このタスクを完了するためのよりよい方法がありますか?

事前に感謝します。どんな質問でも躊躇しないでください。

よろしく ベティ

+1

"AND AgendaItemNumber = AgendaItemNumber ..."ええ、なぜ? – adelphus

+0

** AND AgendaItemNumber = AgendaItemNumber AND AgendaName = AgendaName AND AgendaTypeDescription = AgendaTypeDescription **は意味がありません。 ** INNER JOIN ** – Kaf

答えて

4
SELECT agenda.AgendaItemNumber, 
     Agenda.AgendaName, 
     AgendaType.AgendaTypeDescription, 
     STUFF((SELECT ';' + FullName 
       FROM UserDetails 
       WHERE UserDetails.AgendaID = Agenda.AgendaID 
       FOR XML PATH('') 
      ), 1, 1, '') AS fullName 
FROM Agenda 
     INNER JOIN AgendaType 
      ON AgendaType.AgendaTypeID=Agenda.AgendaTypeID 
     INNER JOIN UserDetails 
      ON Agenda.AgendaID = Userdetails.AgendaID 
WHERE agenda.AgendaTypeID = '2' 
AND  AgendaItemNumber = AgendaItemNumber 
AND  AgendaName = AgendaName 
AND  AgendaTypeDescription = AgendaTypeDescription 
AND  AgendaItemNumber >= '3' 

ADENDUM

SQL-ServerのXML拡張機能を使用すると、単一の行に複数の行を連結することができます。拡張の実際の意図はXML(明らかに)として出力することができるが、拡張の副産物であるいくつかの素晴らしいテクニックがある。上記のクエリでは、サブクエリ(FullName)に列名がある場合は、<FullName>Joe Bloggs1</FullName><FullName>Joe Bloggs2</FullName>として出力されます。列名がないため、行を連結するだけです(適切なXMLを構成しないため)。 PATHパートでは、追加のノードを指定できます。たとえば、上記でPATH( 'Name')を使用すると、<Name>;Joe Bloggs</Name><Name>;Joe Bloggs2</Name>が得られます。パスを列名と組み合わせると、Joe Bloggsになります。

最後にSTUFFは、リストの先頭にあるセミコロンを削除するだけです。

+0

@GarethD上記のクエリに感謝します。これは治療をするためにsmemems。 XML Pathが何をしているのか聞いてもいいですか?本質的にFullName列のクエリのCONCAT部分です。クエリーの....、1,1 '')部分が何をしているのかは分かりません。しかし、これはトリックです。どうもありがとう。 – Betty

+0

@デルファスの説明が追加されました。 – GarethD

+0

@Betty 'STUFF(.. 1,1、 '')'パーツは最初のセミコロンを削除するだけで、 "; Name1; Name2"ではなく "Name1; Name2"を取得します。 'FullName + ';''を使用して 'STUFF'を完全に削除して、この" Name1; Name2; "のようなリストを得ることができます – GarethD

関連する問題