2013-12-11 44 views
1

我一直在閱讀其他類似的「多記錄到一個」的帖子,但要麼似乎無法得到任何工作,或他們並不真正適用於我想要做的。SQL Server 2008 ssrs多個記錄到一個

這是我的3張桌子。車輛,vehicle_repair評論

  • vehicle列:vehicle_name等車輛相關信息,vehicle_make,vehicle_model
  • vehicle_repair列:vehicle_name,vehicle_repair_type,vehicle_repair_num,等等等等
  • comments列:vehicle_name,vehicle_repair_num,comments_detail

程序寫入的方式,如果我寫了多於1行的註釋,它不會連接它們,它會爲每行寫入1個條目,即:

comments表:

vehicle_name     vehicle_rpr_num    comments_detail 
-------------------------------------------------------------------- 
150       1   replaced hose 
750       1   replaced belt 
750       2   replaced fuel and also saw that the 
750       2   timing belt needs to be replaced 
750       2   as well 

我嘗試使用類似:

select 
    substring((select ' '+comments_detail AS 'data()' 
       from comments 
       for xml path('')), 3, 80) as 'comments_detail' 
from 
    comments 

我試圖添加一個連接和其他表的子內,但隨後comments_details成爲各頂起,就像它一次結合20條評論而不是1條。

我寧願從頭開始,看看我能否以另一種方式工作。

我試圖鏈接上面的3個表時遇到了我的問題。

我不知道如何把在我從車表需要其他字段,即vehicle_make,vehicle_model

任何想法?我寫我的連接完全錯了嗎?我試圖把它放到一個存儲過程中,這樣一個觀點會更好嗎?

+0

你能告訴你用來拉這個數據的查詢??? –

+0

+1提供示例數據並顯示努力 – Bryan

回答

0
SELECT c1.vehicle_name, 
     c1.vehicle_rpr_num, 
     STUFF((SELECT ' ' + comments_detail 
       FROM comments c2 
       WHERE c2.vehicle_name = c1.vehicle_name 
        AND c2.vehicle_rpr_num = c1.vehicle_rpr_num 
       FOR XML PATH(''), TYPE).value('.', 'varchar(max)'), 
      1,1,'') 
     AS comments 
FROM comments c1 
GROUP BY c1.vehicle_name, c1.vehicle_rpr_num; 

SQLFiddle與樣品comments數據。

你在正確的軌道上使用FOR XML PATH連接評論。連接有很多不同的方式,關於每種方式的優缺點的好文章是here。我把它放到視圖定義中,以便更容易地與其他表連接。

+0

我對視圖不太瞭解,但我的車輛相關文件,最終加入視圖的文件可能有一百萬條評論。運行基於視圖的報告時,會不會影響我的表現? – Phil

+0

如果'vehicle_name'和'vehicle_rpr_num'列不是'comments'表上的主鍵的一部分,我會感到驚訝。主鍵通常是聚簇索引,當查詢特定的'vehicle_name'或'vehicle_rpr_num'時,這將有助於您的查詢更好地執行。如果您有興趣學習更多知識,這是一個很好的入門文章。(文章)(https://www.simple-talk.com/sql/learn-sql-server/sql-server-index-basics/)。 – Bryan

+0

並回答你的問題 - 以這種方式連接行的任何查詢都不是最理想的,因爲你不止一次地掃描(或查找)「評論」表,有效地加倍了I/O操作。最佳解決方案是修復應用程序,以便不必運行連接查詢。視圖定義將是一個停止差距,直到可以應用修復。 – Bryan

0
CREATE TABLE tbl (vehicle_name INT,vehicle_rpr_num INT,comments_detail NVARCHAR(1000)) 

INSERT INTO tbl 
VALUES 
(150,1,'replaced hose'), 
(750,1,'replaced belt'), 
(750,2,'replaced fuel and also saw that the'), 
(750,2,'timing belt needs to be replaced'), 
(750,2,'as well') 

SELECT DISTINCT t.vehicle_name, t.vehicle_rpr_num , STUFF(List.Comments, 1 ,2, '') AS Comments 
FROM tbl t 
     CROSS APPLY (
        SELECT ' ' + comments_detail [text()] 
        FROM tbl 
        WHERE vehicle_name = t.vehicle_name 
        AND vehicle_rpr_num = t.vehicle_rpr_num 
        FOR XML PATH('') 
        )List(Comments) 

結果集

vehicle_name vehicle_rpr_num Comments 
150      1   eplaced hose 
750      1   eplaced belt 
750      2   eplaced fuel and also saw that the timing belt needs to be replaced as well 
+0

我會試試這個。謝謝穆罕默德 – Phil

+0

沒問題朋友:) –

相關問題