2013-12-11 42 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

没问题朋友:) –

相关问题