SQL查询根据定义的序列合并行

时间:2015-07-11 13:41:41

标签: sql sql-server

我有2个表TableATableB,这是两个表的数据

OrderNumber LineSEQNo   SequenceNumber  CommentText
2145106     0000000001      000           ABB -
2145106     0000000001      001           2" AL. pole 7'8"    

和TableB如下

    SalesOrderNumber    LineSEQNo       desc1           desc2
      2145106           0000000001      ORDER DIDN't     NULL
      2145106           0000000002      ABB              BCC                                      
      2145106           0000000003      NULL             Customer did NOT get any.  

现在我想要TableB的输出。我的意思是输出应该与TableB具有相同的计数...

  1. 每行表格会有一个LineSEQNo(不同)
  2. TableB.LineSEQNo会在TableA核对LineSEQNo。如果它存在于TableA中,则会显示该SequenceNumber的{​​{1}},并根据顺序将LineSEQNo合并为一行。
  3. 如果CommentText中不存在LineSEQNo,那么TableAdesc1将会联合desc2
  4. 因此输出应如下所示:

    LineSEQNo

    希望我说清楚。

    现在只有解决方案的解决方案才是2145106 0000000001 ABB - 2" AL. pole 7'8" 2145106 0000000002 ABB BCC 2145106 0000000003 Customer did NOT get any. 循环..

    有没有其他方法可以在没有循环的情况下获得所需的结果?

1 个答案:

答案 0 :(得分:2)

困难的部分是连接tablea的字符串。您可以在子查询中执行此操作,然后使用left join并使用coalesce()完成逻辑:

select b.*,
       coalesce(a.commenttext, coalesce(desc1, '') + coalesce(desc2, '')       
from tableb b left join
     (select a.ordernumber, a.lineseqno,
             (select a2.commenttext as commenttext
              from tablea a2
              where a2.ordernumber = a.ordernumber and a2.lineseqno = a.lineseqno
              for xml path (''), TYPE
             ).value('.[1]', N'varchar(max)') as commenttext
      from tablea a
      group by a.ordernumber, a.lineseqno 
     ) a
     on b.ordernumber = a.ordernumber and b.lineseqno = a.lineseqno;

Here是一个显示基本想法的SQL小提琴。