2016-10-04 54 views
1

當我連接表時兩次從表二得到不同的數據,如果表二得到不同的行數數據某一列是重複的。重複列時兩次連接表

select 
o.order_no 
,sr.reason as reason1 
,datediff(minute,s.begin_stop,s.end_stop) as s1 
,sr2.reason as reason2 
,datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2 
from [order] o 
left join [stops] s on s.order_id=o.id and s.section='print' 
join [stopreason] sr on s.error_code=sr.code 
left join [stops] s2 on s2.order_id=o.id and s2.section='laminate1' 
join [stopreason] sr2 on sr2.code=s2.error_code 
where datepart(ww,o.date_onexit)=39 
order by order_no 

和我得到這個resoult

enter image description here

+0

更好,如果你顯示你的初始表和所需的表 –

回答

1

試試這個:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason1, 
      datediff(minute,s.begin_stop,s.end_stop) as s1, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and s.section='print' 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
), part2 AS (
    select o.order_no, 
      sr2.reason as reason2, 
      datediff(MINUTE,s2.begin_stop,s2.end_stop) as s2, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no ORDER BY o.order_no) as rn 
    from [order] o 
    left join [stops] s2 
     on s2.order_id=o.id and s2.section='laminate1' 
    join [stopreason] sr2 
     on sr2.code=s2.error_code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part2 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN 
order by p1.order_no 

首先CTE(part1)爲section='print'收集數據,第二 - 爲section='laminate1'。我們添加ROW_NUMBER()。然後加入兩個CTE。

另一種方式:

;WITH part1 AS (
    select o.order_no, 
      sr.reason as reason, 
      datediff(minute,s.begin_stop,s.end_stop) as s, 
      s.section, 
      ROW_NUMBER() OVER (PARTITION BY o.order_no,s.section ORDER BY o.order_no) rn 
    from [order] o 
    left join [stops] s 
     on s.order_id=o.id and (s.section='print' or s.section='laminate1') 
    join [stopreason] sr 
     on s.error_code=sr.code 
    where datepart(ww,o.date_onexit)=39 
) 

SELECT p1.order_no, 
     p1.reason1, 
     p1.s1, 
     p2.reason2, 
     p2.s2 
FROM part1 p1 
LEFT JOIN part1 p2 
    ON p1.order_no = p2.order_no AND p1.rn = p2.RN AND p2.section='laminate1' 
WHERE p1.section='print' 
order by p1.order_no 
+0

感謝@ gofr1但沒有任何縮減的方式做到這一點,我應該在另一個更大的代碼中使用此代碼,我應該使用這5次和從表格順序的另一列變得越來越大 –

+0

我再加一個方法,請試試看。 – gofr1

+0

謝謝@ gofr1但我尋找一種不同的方式,不使用cte,有沒有另一種方式? –