2011-08-06 6 views
0

개인이 특정 행의 행을 반환하는 쿼리를 가지고 있지만 개별 행으로 표시됩니다. 두 행을 하나로 병합하는 것이 좋습니다.반환 쿼리에서 하나의 행으로 병합하는 두 행

SELECT  dbo.households.id, dbo.individuals.firstname, dbo.individuals.lastname 
FROM   dbo.households INNER JOIN 
         dbo.individuals ON dbo.households.id = dbo.individuals.householdID 
WHERE  (dbo.households.id = 10017) 

현재 결과 :

ID | First Name | Last Name | 
1 | Test  | Test1  | 
1 | ABC  | ABC1  | 

원하는 결과 :

ID | First Name | Last Name |ID1| First Name1| Last Name1| 
1 | Test  | Test1  |1 | ABC  | ABC1  | 

그러나 다음 프로그래머 3 사람들은 모두 3 등

+0

결과를 어떻게 보이시겠습니까? 하나의 행에 N 레코드의 N * 3 열이 있습니까? – psr

+0

'PIVOT'을 원하십니까, 두 행의 데이터를 하나의 행 (firstname1, lastname1, firstname2, lastname2, ...)에 넣으시겠습니까? 그렇다면 동적 열 수를 반환하기 때문에 동적 SQL이 필요할 것입니다. 레이아웃에서 데이터를 가져와야하는 요구 사항은 무엇입니까? – mellamokb

+0

그래 내가 걱정하는 것, 사람들의 수는 가구에 따라 바뀔 수있다. –

답변

1

에에 따라 병합 할 필요가있는 경우 위에 질문 한 질문에 대한 응답으로 이름을 문자열로 컴파일하는 간단한 스크립트가 있습니다. 다음 출력 문자열 (지금은 문법 검사기에 액세스 할 수 있으므로 오류를 용서하지 않음) :

DECLARE 
    @CNT INT, 
    @R_MAX INT, 
    @H_ID INT, 
    @R_FIRST VARCHAR(250), 
    @R_LAST VARCHAR(250), 
    @R_NAMES VARCHAR(MAX) 

SET @CNT = 0; --Counter 
SET @R_NAMES = 'Names: '; 
SELECT @R_MAX = COUNT(*) FROM dbo.individuals a WHERE a.householdID = @H_ID; --Get total number of individuals 
PRINT(@R_MAX); --Output # of matching rows 
--Loop through table to get individuals 
WHILE @CNT < @R_MAX 
    BEGIN 
     --Select statement 
     SELECT * FROM (SELECT 
      @R_FIRST = b.firstname, 
      @R_LAST = b.lastname, 
         ROW_NUMBER() OVER (ORDER BY b.lastname, b.firstname) AS Row 
     FROM 
      dbo.households a INNER JOIN 
      dbo.individuals b ON a.id = b.householdID 
     WHERE 
      (a.id = @H_ID)) AS RN WHERE (Row = @CNT); 

     SET @R_NAMES = @R_NAMES + @R_FIRST + @R_LAST + '; '; --Add individual's name to name string 
       PRINT(CAST(@CNT AS VARCHAR) + ':' + @R_NAMES); 
     SET @CNT = @CNT +1; --Increase counter 
    END 

PRINT(@R_NAMES); --Output the individuals 
+0

didnt는 그것이 내가 어쩌면 내가 작업의 각 행 유형에 대해 할 수 있었다라고 생각했을 정도로 복잡했다는 것을 깨닫는다. 그러나 그것은 작동하지 않았다 –

+0

이것은 유일한 방법이 아니다. 그러나 이것은 내가 그것을 취급 할 것 인 방법 일 것이다. 나는 실제로 그것을 저장 프로 시저에 포팅하여 이식성을 돕고 @R_ID를 저장 프로 시저의 매개 변수로 전달합니다. 그런 다음 모든 가정의 ID를 반복하는 루프를 설정할 수도 있습니다. – RobB

+0

그들은 같은 열에있을 수 있지만 저장 프로 시저에서이를 구현하는 데 어려움을 겪고 있습니다. r_id는 세대 ID와 동일하거나 행 ID입니다. –

1

당신이, 당신이 XML 경로 사용할 수 있습니다 최대 SQL Server 2005 또는를 사용하고 제공 ('')를 사용하여 문자열을 연결합니다.

이 수동 루프를 할 필요없이 당신이 원하는 일을해야합니다 편집 : 고쳐 SQL을 실제로 작동하는

SELECT households.id, 
    STUFF(
    (
     SELECT '; ' + [firstname] + '|' + lastname AS [text()] 
     FROM individuals 
     WHERE individuals.householdID = households.id 
     FOR XML PATH('') 
    ) 
    , 1, 2, '') -- remove the first '; ' from the string 
    AS [name] 
FROM dbo.households 
WHERE (households.id = 10017) 

이 데이터의 형식에 아주 가까이있다 (지금은 SQL에 액세스 할 수 있습니다) 네가 원했던거야.

데이터를 XML로 변환 한 다음 (PATH ('')로 인해 실제 XML 마크 업없이) 헤더 행으로 다시 결합합니다.

+0

xml 경로가 작동하는 방법 정보를 제공해 주셔서 감사합니다. 흥미로운 방법이 될 것입니다. –

+0

SQL이 작동하도록 내 대답을 업데이트했습니다. – Seph

관련 문제