2011-08-06 48 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

沒有意識到這是如此複雜,我想也許我可以做一個每行類型的東西,但它不工作 –

+0

這不是唯一的方法,但這將是我將如何處理它。我實際上將它扔到存儲過程中以幫助實現可移植性,並將@R_ID作爲參數傳遞給存儲過程。你甚至可以設置一個循環遍歷每個家庭ID。 – RobB

+0

他們可以在同一列,但我很難在存儲過程中實現這一點。會r_id是相同的家庭ID或是否是行ID –

1

只要你使用的是SQL Server 2005或,你可能能夠使用FOR XML PATH ('')連接字符串。

這應該做你想要什麼,而不必做手工循環: 編輯:搞掂SQL實際工作(現在我有機會獲得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) 

這是相當接近的數據格式你想要的。

它將數據轉換爲XML(由於PATH('')而沒有任何實際的XML標記),然後將其加回到標題行。

+0

xml路徑如何工作 感謝您的信息,這將是一個有趣的方法 –

+0

我已經更新了我的答案,以便SQL現在可以工作 – Seph