1

みなさん、おはよう、

次のクエリをどのように解決する必要があるのか​​ わかりません... 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'

上記のクエリは機能しますが、これを少し強化する必要があります。次の結果が返されますが、これは基本的に「フルネーム」列を除いて重複レコードです...

結果_画像

私がやりたいことは、このクエリにコードを追加して、クエリを実行すると、「AgendaItemNumber」ごとに 1 つのレコードを表示し、このレコードの両方のフルネームを連結できるようにすることです。ただし、このテーブルには追加の AgendaItemsNumbers があり、ユーザーのフルネームが 1 つしか割り当てられていません。画像ファイル内のこれらのいくつかのレコードだけで、何か巧妙なことをする必要があります。

おそらく、このタスクを完了するためのより良い方法がありますか?

よろしくお願いします。ご不明な点がございましたら、お気軽にお問い合わせください。

よろしくベティ

4

1 に答える 1

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'

補遺

SQL-ServerのXML拡張機能を使用すると、複数の行を1つの行に連結できます。拡張機能の実際の目的は、XMLとして(明らかに)出力できるようにすることですが、拡張機能の副産物であるいくつかの気の利いたトリックがあります。上記のクエリでは、サブクエリ(FullName)に列名がある場合、列名<FullName>Joe Bloggs1</FullName><FullName>Joe Bloggs2</FullName>がないため、単に行を連結します(適切なXMLを形成しません)。このPATH部分では、追加のノードを指定できます。たとえば、上記でPATH('Name')を使用すると、次のようになります<Name>;Joe Bloggs</Name><Name>;Joe Bloggs2</Name>。Pathを列名と組み合わせると、JoeBloggsが得られます。

最後にSTUFF、リストの先頭にあるセミコロンを削除します。

于 2012-03-12T11:35:43.000 に答える