2014-07-14 2 views
0

나는 쿼리를 작성 중이므로 도움이 될 것입니다. 나는 시도하고있는 것을 전달하고자하는 단순한 버전의 쿼리를 제공 할 것이다.여러 행을 1 행의 다른 열로 조인 SQL Server

주어진 다음의 표 :

  • TableA (RecordNumber, TableAID, someValue와)
  • TableB (RecordNumber, X, Y, Z)
  • TableC (RecordNumber, D, E, F, G)

내가 찾고 있어요 결과 집합 :

TableB.RecordNumber, X, Y, Z, D, E, F, G, SomeValue1, SomeValue2, SomeValue3, SomeValue4 

내 쿼리는 현재 나는이 TableA의에서 someValue와 당 1 개 행을 반환하는 것을 깨닫게

Select 
    TableB.RecordNumber, X, Y, Z, D, E, F, G, SomeValue1) 
inner join 
    TableC on TableB.RecordNumber = TableC.RecordNumber 
inner join 
    TableA on TableB.RecordNumber = TableA.RecordNumber 

입니다.

내가 뭘하고 싶은지 에 대한 SomeValueX을 채우는 1 행에 해당 레코드 번호에 대한 행 X의 SomeValue 값을 조합하는 것이 좋습니다.

생각하십니까?

+0

Sql **에서는 쿼리의 시작 부분에서 열 수를 알아야합니다. 유일한 옵션은 동적 SQL입니다. 먼저 TableA에 필요한 SomeValue 열 수를 묻고 해당 정보를 사용하여 완전히 새로운 SQL 문자열을 작성합니다. –

답변

0

동적 SQL을 사용하지 않고도 가변 개수의 열을 가질 수는 없지만 단일 열에는 여러 개의 쉼표로 구분 된 값을 사용할 수 있습니다. TableA.SomeValue는 문자 또는 문자열 데이터 유형이 아닌 경우

SELECT b.RecordNumber, X, Y, Z, D, E, F, G, 
    STUFF((
     SELECT ',' + SomeValue 
     FROM TableA a 
     WHERE a.RecordNumber = b.RecordNumber 
     ORDER BY SomeValue 
     FOR XML PATH('') 
     ), 1, 1, '') AS SomeValues 
FROM TableB b 
INNER JOIN TableC c 
    ON b.RecordNumber = c.RecordNumber 

은 또한 적절한 길이의 VARCHAR로 캐스팅 할 것입니다.

관련 문제