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에 대해 하나의 레코드를 표시 할 수 있으며이 레코드에 대한 전체 이름을 모두 연결할 수 있습니다. 그러나 나는이 테이블에 추가 된 AgendaItemsNumbers가 1 x 사용자 fullname 만 할당되어 있습니다. 그 이미지 파일 내의 단지 몇 가지 레코드는 내가 영리하게 뭔가를 할 필요가있다.

아마도이 작업을 완료하는 더 좋은 방법이 있을까요?

미리 감사드립니다. 모든 질문은 주저하지 말고 물어보십시오.

감사 베티

+1

"AND AgendaItemNumber = AgendaItemNumber ...". 음, 왜? – adelphus

+0

** 및 AgendaItemNumber = AgendaItemNumber 및 AgendaName = AgendaName 및 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>이됩니다. Path를 열 이름과 결합하면 Joe Bloggs를 얻을 수 있습니다.

마지막으로 STUFF은 목록 시작 부분의 세미콜론 만 제거합니다.

+0

@GarethD 위 쿼리에 대해 많은 감사를드립니다. 이것은 대접을 위해 smemems. XML Path가하는 일을 물어봐도 될까요? 기본적으로 FullName 열에 대한 쿼리의 CONCAT 부분입니다. 확실하지 않은 ...., 1,1 '') 쿼리의 일부가 않습니다. 그러나 이것은 트릭을 수행합니다. 많은 감사. – Betty

+0

@adelphus 설명이 추가되었습니다. – GarethD

+0

@Betty'STUFF (.. 1, 1, '')'파트는 첫 번째 세미콜론을 제거하기 때문에 "; Name1; Name2"대신 "Name1; Name2"를 얻습니다. 'FullName + ';''을 사용하고'STUFF'를 완전히 제거하여 "Name1; Name2;"와 같은 목록을 얻을 수 있습니다. – GarethD